用 spring,注解是个绕不开的话题。spring-boot 中常用@RestController 与 @Controller 来分置 api 与 web 开发。yii与其思路一致,以不同命名空间下的控制器yii\rest\ActiveController 及 yii\web\Controller ,达到差异化控制。为了最小侵入式,spring-boot 经常使用依赖注入+动态代理,而非是强引用关系的继承,最典型的莫过于 webmvc 中 controller 设计
核心容器
Core Container 由 spring-core , spring-beans , spring-context , spring-context-support和 spring-expression (Spring表达式语言)模块组成
- Context ( spring-context )模块构建在 Core and Beans 模块提供的坚实基础之上,添加对国际化(例如,使用资源包),事件传播,资源加载以及通过例如Servlet容器透明创建上下文的支持.
- spring-context-support 支持将常见的第三方库集成到 Spring 应用程序上下文中,用于缓存,邮件(JavaMail),调度(CommonJ,Quartz)和模板引擎(FreeMarker,JasperReports,Velocity)
- spring-expression 用于在运行时查询和操作对象图,命名变量以及从 Spring 的 IoC 容器中按名称检索对象,列表投影和选择以及常用列表聚合
注解处理流程(JSR269提案)
- 编译器把源代码解析生成AST抽象语法树
- 注解处理器阶段
- 分析和生成,此时前两步完成后,生成字节码(进行类型擦除)
注解处理方式
- 运行时反射机制
- Java 提供的 API 来处理编译期的注解
javac编译过程
- 解析和填充符号表
- 解析Parser 词法分析 语法分析
- 插入式注解处理器的注解处理
- jdk1.6+ 插入式注解标准API开发
- 编译期插入式注解处理器对注解进行处理
- 分析与字节码生成
字节码增强
Java字节码增强指的是在Java字节码生成之后,对其进行修改
- 修改字节码 在内存中获取到原来的字节码,然后通过一些工具(如 ASM,Javaasist)来修改它的byte[]数组
- 使修改后的字节码生效
- 方式一:自定义` ClassLoader` 来加载修改后的字节码 - 替换掉原来的字节码:在 `JVM` 加载用户的 `Class` 时,拦截,返回修改后的字节码,或者在运行时,使用`Instrumentation.redefineClasses`方法来替换掉原来的字节码
java动态代理
JDK的java.lang.reflect.Proxy实现InvocationHandler 接口 动态代理。
spring 的动态代理使用字节码增强,实现了两种代理方式,jdk接口动态,cglib 继承动态。代理策略,基于目标类有否实现接口类,有则默认使用jdk动态代理。没有但强制使用cglib,则用继承式代理。
- 动态代理核心 将分散的对对象不同方法的调用转发到一个同一的处理函数中
- 动态代理实现AOP 即在执行函数前和执行函数后都能执行自己定义的钩子
- 实现RPC
- PRC本质将函数调用方和函数的提供方分散在两个不同的进程上
- 中间使用网络通信来进行数据交互,RPC调用其实是对远程另外一台机器进程上的对象的代理
- 处理中心将调用的信息封装打包,通过网络发送给另外一个进程
JVM 类加载步骤
- 加载 通过类的全限定名获取到类的二进制流
- 验证 确保Class 文件的字节流中包含的信息符合虚拟机的要求
- 准备 为类变量分配内存空间并设置类变初始值
- 解析
- 初始化 根据用户指定的代码初始化字段和其他资源, 执行 static 块
Class.forName(className, true, currentLoader) 默认 获取到 Class 对象时, 会自动对类进行初始化
ClassLoader.loadClass 并不会初始化类,因此类中的静态代码块不会执行
元配置信息
- bean定义本质上是用于创建一个或多个对象的配方
- Bean及其之间的依赖关系反映在容器使用的配置元数据中
- 配置元数据以 XML,Java注解或Java代码(java类)表示
无论是何种形式的配置,在容器内部是 BeanDefinition 实例来描述依赖
Bean依赖管理
spring 提供了一系列Aware接口 ,允许bean向容器指示它们需要某种基础结构依赖性
接口列表与已注入的依赖关系
- ApplicationContextAware 声明应用上下文
- ApplicationEventPublisherAware 封装事件发布者
- BeanClassLoaderAware 用于加载bean类的类加载器
- BeanFactoryAware 声明 BeanFactory
- BeanNameAware 声明bean的名称
- BootstrapContextAware 资源适配器,通常仅在JCA中可用
- LoadTimeWeaverAware 定义的weaver(织入)用于在加载时处理类定义
- MessageSourceAware 用于解析消息的已配置策略
- NotificationPublisherAware Spring JMX通知发布商
- PortletConfigAware 当前 PortletConfig 容器运行
- PortletContextAware
- ResourceLoaderAware 用于对资源进行低级访问
- ServletConfigAware
- ServletContextAware
© 著作权归作者所有
发表评论