Spring
容器创建初始化
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的事情驱动容器,事件监听和派发
Spring
事务管理
Spring对configuration类会进行特殊处理
1.导入相关依赖、数据源、数据库驱动
2.配置数据源,jdbcTemplate操作数据
3.@transactional给方法上添加注解,表示为一个事务方法
4.@enableTransactionManagement开启事务管理功能
5.配置事务管理器来管理事务platFormTransationManager,注册事务管理器在容器中
autoProxyRegistrar:利用后置处理器包装对象,返回代理对象
proxyTransationManager:事务增强器要用事务注解信息、事务拦截器保存事务属性信息,事务管理器、
Spring
AOP总结
1.@enableAspectJAutoProxy开启AOP功能
2.@enableAspectJAutoProxy会给容器注册一个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方法,会初始化多拨器,注册所有的监听器
Spring
扩展原理
beanPostProcessor:bean后置处理器,bean初始化之后进行拦截工作
beanFactoryProcessor:beanFactory后置处理器,beanFactory标准初始化之后调用,所有bean定义已经保存加载到beanFactory但是bean的实例还未创建
beanDefinitionRegistryPostRegistor:在bean所有信息被加载,但是bean实例未创建时
1.IOC容器创建对象
2.执行beanFactoryInvock方法,在创建初始化其他组件前面执行
Spring
事务管理
Spring对configuration类会进行特殊处理
1.导入相关依赖、数据源、数据库驱动
2.配置数据源,jdbcTemplate操作数据
3.@transactional给方法上添加注解,表示为一个事务方法
4.@enableTransactionManagement开启事务管理功能
5.配置事务管理器来管理事务platFormTransationManager,注册事务管理器在容器中
autoProxyRegistrar:利用后置处理器包装对象,返回代理对象
proxyTransationManager:事务增强器要用事务注解信息、事务拦截器保存事务属性信息,事务管理器、
Spring
AOP总结
1.@enableAspectJAutoProxy开启AOP功能
2.@enableAspectJAutoProxy会给容器注册一个annotationAwareAspectJAutoProxyCreator后置对象
4.容器创建流程:
registerBeanPostProcessor注册后置处理器创建annotationAwareAspectJAutoProxyCreator对象
finishBeanFactoryInitialization初始化剩下的bean:创建业务逻辑组件和切面组件、拦截器组件创建流程、创建完之后用包装增强;给业务组件创建代理对象
5.执行目标方法,代理对象要执行目标方法:
cgLib进行拦截
得到目标方法的拦截器链
利用拦截器链收集机制,依次执行
执行效果:正常/异常
正常情况:
异常情况:
Spring
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.以后容器中获取到的就是增强的代理对象,如果使用就会执行通知方法流程
Spring
profile切换组件
Spring为我们提供根据当前环境,动态切换和激活一系列组件的功能
开发环境/测试环境/生产环境
profile指定组件在那个环境下,才能被注册到容器中,不指定在任何环境下都能注册
1.加了环境表示的bean,只有这个环境被激活的时候,才能被注册到容器中,默认是default
使用命令行参数-D
代码方式:创建IOC、设置环境、注册主配置、启动刷新环境
2.放在类上,整个类都受影响
3.没有标注,任何环境下都加载
Spring
属性赋值
@propertySource导入配置文件k/v,保存到环境变量中
1.@value直接赋值、SpEL表达式#{}、取出配置文件的值${}
自动装配
Spring利用依赖注入(DI),完成各个组件的依赖关系
1.@autoWired自动注入
默认优先按照类型去容器中找
如果找到多个,就将属性名作为组件的id去查找
@qualifier指定要装配的组件id
默认一定要将属性赋值好,没有就报错,require来指定是否必须
@primary让Spring自动装配的时候默认使用首选的bean
2.Spring支持使用resource和inject注解
@resource默认按照名称装配,没有autoware那么全
@autoWare在方法、属性、构造器,参数
3自定义组件想使用Spring容器的一些组件(applicationContent),自定义实现xxxAware,自创建对象的时候,调用接口规定的方法注入相关组件
Spring
bean的生命周期
构造对象:
单实例容器创建
多实例每次调用
初始化:
对象创建好,并赋值好,调用初始化
销毁:
单实例,容器关闭时
多实例,容器不会管理这个bean,容器不会调用销毁方法
1.@bean注解指定初始化和销毁方法
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 接口自定义
@import 默认全类名
!importSelectors 导入选择器
!importBeanDefinitionRegister自定义
@factoryBean创建工厂bean
1.包扫描+四大注解
2.@bean倒入第三方包里面的组件
3.@import快速给容器中导入组件
4.使用spring提供的factoryBean