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创建完成(初始化生命周期相关的内容) 

Spring源码笔记_第1张图片

Spring
servlet3.0


tomcat7以上版本支持
@webServlet代替web.xml的配置(filter、listener)
@handlTypes传入感兴趣类型


共享库/运行时插件
1.servlet容器启动,里面每个jar包的servletContentInitializer的实现类
2.servletContext当前容器,运行时插件的机制加入感兴趣类型

3.使用servlet Context注册组件(filter、listener、servlet)

Spring源码笔记_第2张图片

 Spring
总结

1.在启动容器的时候,首先注册bean 的定义信息
2.当容器中有这些bean的时候,Spring会在合适的时机初始化bean
3.后置处理器,每个bean创建完成都会用他增强bean的功能(代理)
4.Spring的事情驱动容器,事件监听和派发 
Spring源码笔记_第3张图片
 Spring
事务管理

Spring对configuration类会进行特殊处理

1.导入相关依赖、数据源、数据库驱动
2.配置数据源,jdbcTemplate操作数据
3.@transactional给方法上添加注解,表示为一个事务方法
4.@enableTransactionManagement开启事务管理功能
5.配置事务管理器来管理事务platFormTransationManager,注册事务管理器在容器中

autoProxyRegistrar:利用后置处理器包装对象,返回代理对象

proxyTransationManager:事务增强器要用事务注解信息、事务拦截器保存事务属性信息,事务管理器、 
Spring源码笔记_第4张图片
 Spring
AOP总结

1.@enableAspectJAutoProxy开启AOP功能
2.@enableAspectJAutoProxy会给容器注册一个annotationAwareAspectJAutoProxyCreator后置对象
4.容器创建流程:
  registerBeanPostProcessor注册后置处理器创建annotationAwareAspectJAutoProxyCreator对象
  finishBeanFactoryInitialization初始化剩下的bean:创建业务逻辑组件和切面组件、拦截器组件创建流程、创建完之后用包装增强;给业务组件创建代理对象
5.执行目标方法,代理对象要执行目标方法:
  cgLib进行拦截
  得到目标方法的拦截器链
  利用拦截器链收集机制,依次执行
  执行效果:正常/异常 

正常情况: 
one-ok


异常情况: 
one-exception


Spring源码笔记_第5张图片
Spring
应用监听器

applicationListener是继承applicationEvent容器中的时间发布触发事件

步骤:
1.写一个监听器来监听某个事件,applicationEvent的一个子事件
 或者使用@eventListener注解
2.把监听器加入到容器中
3.只要容器相关发布,就会触发这些事件
4.自己发布一个事件applicationContext.publishEvent来发布

原理:
1.容器创建对象的时候调用refresh
2.容器刷新完成调用finishRefresh
3.流程:
 获取到事件的派发器(多拨器)
 for循环所有监听-派发事件
 执行监听器,回调onapplicationEvent方法

3.注解使用eventListenerProsser处理器

多拨器是在容器创建对象的时候,调用refresh方法,会初始化多拨器,注册所有的监听器 
Spring源码笔记_第6张图片
Spring
扩展原理

beanPostProcessor:bean后置处理器,bean初始化之后进行拦截工作

beanFactoryProcessor:beanFactory后置处理器,beanFactory标准初始化之后调用,所有bean定义已经保存加载到beanFactory但是bean的实例还未创建

beanDefinitionRegistryPostRegistor:在bean所有信息被加载,但是bean实例未创建时

1.IOC容器创建对象
2.执行beanFactoryInvock方法,在创建初始化其他组件前面执行 
Spring源码笔记_第7张图片
Spring
事务管理

Spring对configuration类会进行特殊处理

1.导入相关依赖、数据源、数据库驱动
2.配置数据源,jdbcTemplate操作数据
3.@transactional给方法上添加注解,表示为一个事务方法
4.@enableTransactionManagement开启事务管理功能
5.配置事务管理器来管理事务platFormTransationManager,注册事务管理器在容器中

autoProxyRegistrar:利用后置处理器包装对象,返回代理对象

proxyTransationManager:事务增强器要用事务注解信息、事务拦截器保存事务属性信息,事务管理器、 
Spring源码笔记_第8张图片
Spring
AOP总结

1.@enableAspectJAutoProxy开启AOP功能
2.@enableAspectJAutoProxy会给容器注册一个annotationAwareAspectJAutoProxyCreator后置对象
4.容器创建流程:
  registerBeanPostProcessor注册后置处理器创建annotationAwareAspectJAutoProxyCreator对象
  finishBeanFactoryInitialization初始化剩下的bean:创建业务逻辑组件和切面组件、拦截器组件创建流程、创建完之后用包装增强;给业务组件创建代理对象
5.执行目标方法,代理对象要执行目标方法:
  cgLib进行拦截
  得到目标方法的拦截器链
  利用拦截器链收集机制,依次执行
  执行效果:正常/异常 

正常情况: 
one-ok


异常情况: 
one-exception


Spring源码笔记_第9张图片
Spring
AOP目标方法执行

简单说:

Spring 采用jdk动态代理模式来实现Aop机制。Spring AOP采用动态代理过程:
1.将切面使用动态代理的方式动态织入到目标对象,形成一个代理对象。
2.目标对象如果没有实现代理接口,那么spring会采用CGLib来生成代理对象,该代理对象是目标对象的子类。
3.目标对象如果是final类,也没有实现接口,就不能运用AOP


1.容器中保存了组件的代理对象,这个对象保存了对象信息、增强器等
2.CGLibAopProxy拦截目标方法的执行:
  获取目标方法的拦截器琏
  如果有拦截器琏,那需要执行的目标对象、目标方法、拦截器琏传入cgLibMethodInvocation对象中
3.拦截器琏的触发过程,processor的递归调用过程,不停拿下一个拦截器
4.某个拦截器被触发,先执行自己的,再继续往下调,由于拦截器是持续往下调,则执行完就执行上一层拦截器

 拦截器保证方法与目标方法的顺序执行

Spring源码笔记_第10张图片

Spring
AOP实际分析

1.每个bean创建之前,调用后置处理器
2.判断bean 是否在adviseBeans中(保存了所有需要增强的bean)
3.判断bean是否为基础类型或是切面类型
4.是否需要跳过:获取后选择的增强器
5.创建对象后置处理器,调用
6.获取所有可用的增强器,如果需要增强创建动态代理对象
7.以后容器中获取到的就是增强的代理对象,如果使用就会执行通知方法流程 
Spring源码笔记_第11张图片
Spring
profile切换组件

Spring为我们提供根据当前环境,动态切换和激活一系列组件的功能

开发环境/测试环境/生产环境

profile指定组件在那个环境下,才能被注册到容器中,不指定在任何环境下都能注册

1.加了环境表示的bean,只有这个环境被激活的时候,才能被注册到容器中,默认是default
  使用命令行参数-D
  代码方式:创建IOC、设置环境、注册主配置、启动刷新环境
  
2.放在类上,整个类都受影响
3.没有标注,任何环境下都加载 
Spring源码笔记_第12张图片
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源码笔记_第13张图片

Spring
bean的生命周期

构造对象:
  单实例容器创建
  多实例每次调用
初始化:
  对象创建好,并赋值好,调用初始化
销毁:
  单实例,容器关闭时
  多实例,容器不会管理这个bean,容器不会调用销毁方法
 
1.@bean注解指定初始化和销毁方法
  initmethod和destroymothod
2.initializingBean定义初始化逻辑
   disposableBean定义销毁逻辑
3.JSR250注解
   @postConstruct构造器创建之后
   @preDestory容器销毁bean之前
4.beanPostProcessor接口,bean的后置处理器,bean初始化前后调用

3 ,4都是在初始化赋值之后调用 
Spring源码笔记_第14张图片

@bean加载 指定type name

@scope 指定作用域

@lazy 懒加载 调用时注册在IOC
@compentsacn 指定扫描
    typeFilter 指定扫描规则
@condition 按照条件注册IOC
    ! condition 接口自定义
@import 默认全类名
    !importSelectors 导入选择器
    !importBeanDefinitionRegister自定义
@factoryBean创建工厂bean

1.包扫描+四大注解
2.@bean倒入第三方包里面的组件
3.@import快速给容器中导入组件
4.使用spring提供的factoryBean 

Spring源码笔记_第15张图片


你可能感兴趣的:(Spring,springboot,springcloud)