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用于解析消息的已配置策略NotificationPublisherAwareSpring JMX通知发布商PortletConfigAware当前 PortletConfig 容器运行PortletContextAwareResourceLoaderAware用于对资源进行低级访问ServletConfigAwareServletContextAware
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu