spring 核心概述
用
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
声明 BeanFactoryBeanNameAware
声明bean的名称BootstrapContextAware
资源适配器,通常仅在JCA中可用LoadTimeWeaverAware
定义的weaver(织入)用于在加载时处理类定义MessageSourceAware
用于解析消息的已配置策略NotificationPublisherAware
Spring JMX通知发布商PortletConfigAware
当前 PortletConfig 容器运行PortletContextAware
ResourceLoaderAware
用于对资源进行低级访问ServletConfigAware
ServletContextAware
本作品采用《CC 协议》,转载必须注明作者和本文链接