Spring源码笔记
Spring
容器创建初始化
1.刷新预处理动作
2.刷新,获取bean工厂
3.bean工厂的预准备工作
4.bean工厂的后置处理工作
5.执行bean工厂的标准初始化后的处理工作
6.注册bean工厂的后置处理器(拦截bean的创建过程
7.初始化messageSource组件(国际化、消息绑定、消息解析)
8.初始化事件派发器
9.onrefresh留给子容器,在容器刷新时自定义逻辑
10.注册监听器,把容器之前的事件、监听注册进来
11.初始化所有剩下的单实例bean
12.完成bean工厂的初始化创建工作,IOC创建完成(初始化生命周期相关的内容)
容器创建初始化
1.刷新预处理动作
2.刷新,获取bean工厂
3.bean工厂的预准备工作
4.bean工厂的后置处理工作
5.执行bean工厂的标准初始化后的处理工作
6.注册bean工厂的后置处理器(拦截bean的创建过程
7.初始化messageSource组件(国际化、消息绑定、消息解析)
8.初始化事件派发器
9.onrefresh留给子容器,在容器刷新时自定义逻辑
10.注册监听器,把容器之前的事件、监听注册进来
11.初始化所有剩下的单实例bean
12.完成bean工厂的初始化创建工作,IOC创建完成(初始化生命周期相关的内容)
Spring
servlet3.0
tomcat7以上版本支持
@webServlet代替web.xml的配置(filter、listener)
@handlTypes传入感兴趣类型
共享库/运行时插件
1.servlet容器启动,里面每个jar包的servletContentInitializer的实现类
2.servletContext当前容器,运行时插件的机制加入感兴趣类型
3.使用servlet Context注册组件(filter、listener、servlet)
Spring
总结
1.在启动容器的时候,首先注册bean 的定义信息
2.当容器中有这些bean的时候,Spring会在合适的时机初始化bean
3.后置处理器,每个bean创建完成都会用他增强bean的功能(代理)
4.Spring的事情驱动容器,事件监听和派发
总结
1.在启动容器的时候,首先注册bean 的定义信息
2.当容器中有这些bean的时候,Spring会在合适的时机初始化bean
3.后置处理器,每个bean创建完成都会用他增强bean的功能(代理)
4.Spring的事情驱动容器,事件监听和派发
Spring
事务管理
Spring对configuration类会进行特殊处理
1.导入相关依赖、数据源、数据库驱动
2.配置数据源,jdbcTemplate操作数据
[email protected]给方法上添加注解,表示为一个事务方法
[email protected]开启事务管理功能
5.配置事务管理器来管理事务platFormTransationManager,注册事务管理器在容器中
autoProxyRegistrar:利用后置处理器包装对象,返回代理对象
proxyTransationManager:事务增强器要用事务注解信息、事务拦截器保存事务属性信息,事务管理器、
事务管理
Spring对configuration类会进行特殊处理
1.导入相关依赖、数据源、数据库驱动
2.配置数据源,jdbcTemplate操作数据
[email protected]给方法上添加注解,表示为一个事务方法
[email protected]开启事务管理功能
5.配置事务管理器来管理事务platFormTransationManager,注册事务管理器在容器中
autoProxyRegistrar:利用后置处理器包装对象,返回代理对象
proxyTransationManager:事务增强器要用事务注解信息、事务拦截器保存事务属性信息,事务管理器、
Spring
AOP总结
[email protected]开启AOP功能
[email protected]会给容器注册一个annotationAwareAspectJAutoProxyCreator后置对象
4.容器创建流程:
registerBeanPostProcessor注册后置处理器创建annotationAwareAspectJAutoProxyCreator对象
finishBeanFactoryInitialization初始化剩下的bean:创建业务逻辑组件和切面组件、拦截器组件创建流程、创建完之后用包装增强;给业务组件创建代理对象
5.执行目标方法,代理对象要执行目标方法:
cgLib进行拦截
得到目标方法的拦截器链
利用拦截器链收集机制,依次执行
执行效果:正常/异常
AOP总结
[email protected]开启AOP功能
[email protected]会给容器注册一个annotationAwareAspectJAutoProxyCreator后置对象
4.容器创建流程:
registerBeanPostProcessor注册后置处理器创建annotationAwareAspectJAutoProxyCreator对象
finishBeanFactoryInitialization初始化剩下的bean:创建业务逻辑组件和切面组件、拦截器组件创建流程、创建完之后用包装增强;给业务组件创建代理对象
5.执行目标方法,代理对象要执行目标方法:
cgLib进行拦截
得到目标方法的拦截器链
利用拦截器链收集机制,依次执行
执行效果:正常/异常
正常情况:
异常情况:
Spring
应用监听器
applicationListener是继承applicationEvent容器中的时间发布触发事件
步骤:
1.写一个监听器来监听某个事件,applicationEvent的一个子事件
或者使用@eventListener注解
2.把监听器加入到容器中
3.只要容器相关发布,就会触发这些事件
4.自己发布一个事件applicationContext.publishEvent来发布
原理:
1.容器创建对象的时候调用refresh
2.容器刷新完成调用finishRefresh
3.流程:
获取到事件的派发器(多拨器)
for循环所有监听-派发事件
执行监听器,回调onapplicationEvent方法
3.注解使用eventListenerProsser处理器
多拨器是在容器创建对象的时候,调用refresh方法,会初始化多拨器,注册所有的监听器
应用监听器
applicationListener是继承applicationEvent容器中的时间发布触发事件
步骤:
1.写一个监听器来监听某个事件,applicationEvent的一个子事件
或者使用@eventListener注解
2.把监听器加入到容器中
3.只要容器相关发布,就会触发这些事件
4.自己发布一个事件applicationContext.publishEvent来发布
原理:
1.容器创建对象的时候调用refresh
2.容器刷新完成调用finishRefresh
3.流程:
获取到事件的派发器(多拨器)
for循环所有监听-派发事件
执行监听器,回调onapplicationEvent方法
3.注解使用eventListenerProsser处理器
多拨器是在容器创建对象的时候,调用refresh方法,会初始化多拨器,注册所有的监听器
Spring
扩展原理
beanPostProcessor:bean后置处理器,bean初始化之后进行拦截工作
beanFactoryProcessor:beanFactory后置处理器,beanFactory标准初始化之后调用,所有bean定义已经保存加载到beanFactory但是bean的实例还未创建
beanDefinitionRegistryPostRegistor:在bean所有信息被加载,但是bean实例未创建时
1.IOC容器创建对象
2.执行beanFactoryInvock方法,在创建初始化其他组件前面执行
扩展原理
beanPostProcessor:bean后置处理器,bean初始化之后进行拦截工作
beanFactoryProcessor:beanFactory后置处理器,beanFactory标准初始化之后调用,所有bean定义已经保存加载到beanFactory但是bean的实例还未创建
beanDefinitionRegistryPostRegistor:在bean所有信息被加载,但是bean实例未创建时
1.IOC容器创建对象
2.执行beanFactoryInvock方法,在创建初始化其他组件前面执行
Spring
事务管理
Spring对configuration类会进行特殊处理
1.导入相关依赖、数据源、数据库驱动
2.配置数据源,jdbcTemplate操作数据
[email protected]给方法上添加注解,表示为一个事务方法
[email protected]开启事务管理功能
5.配置事务管理器来管理事务platFormTransationManager,注册事务管理器在容器中
autoProxyRegistrar:利用后置处理器包装对象,返回代理对象
proxyTransationManager:事务增强器要用事务注解信息、事务拦截器保存事务属性信息,事务管理器、
事务管理
Spring对configuration类会进行特殊处理
1.导入相关依赖、数据源、数据库驱动
2.配置数据源,jdbcTemplate操作数据
[email protected]给方法上添加注解,表示为一个事务方法
[email protected]开启事务管理功能
5.配置事务管理器来管理事务platFormTransationManager,注册事务管理器在容器中
autoProxyRegistrar:利用后置处理器包装对象,返回代理对象
proxyTransationManager:事务增强器要用事务注解信息、事务拦截器保存事务属性信息,事务管理器、
Spring
AOP总结
[email protected]开启AOP功能
[email protected]会给容器注册一个annotationAwareAspectJAutoProxyCreator后置对象
4.容器创建流程:
registerBeanPostProcessor注册后置处理器创建annotationAwareAspectJAutoProxyCreator对象
finishBeanFactoryInitialization初始化剩下的bean:创建业务逻辑组件和切面组件、拦截器组件创建流程、创建完之后用包装增强;给业务组件创建代理对象
5.执行目标方法,代理对象要执行目标方法:
cgLib进行拦截
得到目标方法的拦截器链
利用拦截器链收集机制,依次执行
执行效果:正常/异常
AOP总结
[email protected]开启AOP功能
[email protected]会给容器注册一个annotationAwareAspectJAutoProxyCreator后置对象
4.容器创建流程:
registerBeanPostProcessor注册后置处理器创建annotationAwareAspectJAutoProxyCreator对象
finishBeanFactoryInitialization初始化剩下的bean:创建业务逻辑组件和切面组件、拦截器组件创建流程、创建完之后用包装增强;给业务组件创建代理对象
5.执行目标方法,代理对象要执行目标方法:
cgLib进行拦截
得到目标方法的拦截器链
利用拦截器链收集机制,依次执行
执行效果:正常/异常
正常情况:
异常情况:
AOP目标方法执行
简单说:
Spring 采用jdk动态代理模式来实现Aop机制。Spring AOP采用动态代理过程: 1.将切面使用动态代理的方式动态织入到目标对象,形成一个代理对象。 2.目标对象如果没有实现代理接口,那么spring会采用CGLib来生成代理对象,该代理对象是目标对象的子类。 3.目标对象如果是final类,也没有实现接口,就不能运用AOP |
1.容器中保存了组件的代理对象,这个对象保存了对象信息、增强器等
2.CGLibAopProxy拦截目标方法的执行:
获取目标方法的拦截器琏
如果有拦截器琏,那需要执行的目标对象、目标方法、拦截器琏传入cgLibMethodInvocation对象中
3.拦截器琏的触发过程,processor的递归调用过程,不停拿下一个拦截器
4.某个拦截器被触发,先执行自己的,再继续往下调,由于拦截器是持续往下调,则执行完就执行上一层拦截器
拦截器保证方法与目标方法的顺序执行
Spring
AOP实际分析
1.每个bean创建之前,调用后置处理器
2.判断bean 是否在adviseBeans中(保存了所有需要增强的bean)
3.判断bean是否为基础类型或是切面类型
4.是否需要跳过:获取后选择的增强器
5.创建对象后置处理器,调用
6.获取所有可用的增强器,如果需要增强创建动态代理对象
7.以后容器中获取到的就是增强的代理对象,如果使用就会执行通知方法流程
AOP实际分析
1.每个bean创建之前,调用后置处理器
2.判断bean 是否在adviseBeans中(保存了所有需要增强的bean)
3.判断bean是否为基础类型或是切面类型
4.是否需要跳过:获取后选择的增强器
5.创建对象后置处理器,调用
6.获取所有可用的增强器,如果需要增强创建动态代理对象
7.以后容器中获取到的就是增强的代理对象,如果使用就会执行通知方法流程
Spring
profile切换组件
Spring为我们提供根据当前环境,动态切换和**一系列组件的功能
开发环境/测试环境/生产环境
profile指定组件在那个环境下,才能被注册到容器中,不指定在任何环境下都能注册
1.加了环境表示的bean,只有这个环境被**的时候,才能被注册到容器中,默认是default
使用命令行参数-D
代码方式:创建IOC、设置环境、注册主配置、启动刷新环境
2.放在类上,整个类都受影响
3.没有标注,任何环境下都加载
profile切换组件
Spring为我们提供根据当前环境,动态切换和**一系列组件的功能
开发环境/测试环境/生产环境
profile指定组件在那个环境下,才能被注册到容器中,不指定在任何环境下都能注册
1.加了环境表示的bean,只有这个环境被**的时候,才能被注册到容器中,默认是default
使用命令行参数-D
代码方式:创建IOC、设置环境、注册主配置、启动刷新环境
2.放在类上,整个类都受影响
3.没有标注,任何环境下都加载
属性赋值
@propertySource导入配置文件k/v,保存到环境变量中
[email protected]直接赋值、SpEL表达式#{}、取出配置文件的值${}
自动装配
Spring利用依赖注入(DI),完成各个组件的依赖关系
[email protected]自动注入
默认优先按照类型去容器中找
如果找到多个,就将属性名作为组件的id去查找
@qualifier指定要装配的组件id
默认一定要将属性赋值好,没有就报错,require来指定是否必须
@primary让Spring自动装配的时候默认使用首选的bean
2.Spring支持使用resource和inject注解
@resource默认按照名称装配,没有autoware那么全
@autoWare在方法、属性、构造器,参数
3自定义组件想使用Spring容器的一些组件(applicationContent),自定义实现xxxAware,自创建对象的时候,调用接口规定的方法注入相关组件
Spring
bean的生命周期
构造对象:
单实例容器创建
多实例每次调用
初始化:
对象创建好,并赋值好,调用初始化
销毁:
单实例,容器关闭时
多实例,容器不会管理这个bean,容器不会调用销毁方法
[email protected]注解指定初始化和销毁方法
initmethod和destroymothod
2.initializingBean定义初始化逻辑
disposableBean定义销毁逻辑
3.JSR250注解
@postConstruct构造器创建之后
@preDestory容器销毁bean之前
4.beanPostProcessor接口,bean的后置处理器,bean初始化前后调用
3 ,4都是在初始化赋值之后调用
bean的生命周期
构造对象:
单实例容器创建
多实例每次调用
初始化:
对象创建好,并赋值好,调用初始化
销毁:
单实例,容器关闭时
多实例,容器不会管理这个bean,容器不会调用销毁方法
[email protected]注解指定初始化和销毁方法
initmethod和destroymothod
2.initializingBean定义初始化逻辑
disposableBean定义销毁逻辑
3.JSR250注解
@postConstruct构造器创建之后
@preDestory容器销毁bean之前
4.beanPostProcessor接口,bean的后置处理器,bean初始化前后调用
3 ,4都是在初始化赋值之后调用
@bean加载 指定type name
@scope 指定作用域
@lazy 懒加载 调用时注册在IOC
@compentsacn 指定扫描
typeFilter 指定扫描规则
@condition 按照条件注册IOC
@condition 按照条件注册IOC
! condition 接口自定义
@import 默认全类名
!importSelectors 导入选择器
!importBeanDefinitionRegister自定义
@factoryBean创建工厂bean
1.包扫描+四大注解
[email protected]倒入第三方包里面的组件
[email protected]快速给容器中导入组件
4.使用spring提供的factoryBean
@import 默认全类名
!importSelectors 导入选择器
!importBeanDefinitionRegister自定义
@factoryBean创建工厂bean
1.包扫描+四大注解
[email protected]倒入第三方包里面的组件
[email protected]快速给容器中导入组件
4.使用spring提供的factoryBean