spring相关知识总结

链接为spring、springboot启动过程流程图
https://www.processon.com/view/link/63f0efd1bcd4c21f5c57dc56

容器启动过程

1、初始化时,注册解析配置类的bean工厂后置处理器ConfigurationClassPostProcessor,解析注解@Autowired、监听器的bean的后置处理器为bean定义
2、将配置类注册为bean定义
3、refresh刷新方法
3.1、准备上下文环境
3.2、获取初始化Bean工厂 DefaultListableBeanFactory
3.3、调用bean工厂的后置处理器,此处解析配置类,将合适的bean注册为bean定义
3.4、注册bean的后置处理器,通过getBean方法获取bean对象,并加入集合
3.5、创建事件多播器,并注册监听器到多播器上
3.6、实例化单例bean,在实例化前后、属性赋值时、初始化前后,通过bean后置处理器对bean进行扩展
3.7、发布容器刷新的事件

AOP原理

AOP主要是通过动态代理对指定的方法进行增强,包括:advise增强的方法,pointcut定义切点(哪些方法需要被增强)advisor封装advise和pointcut;
1、通过注解@EnableAspectJAutoProxy开启
2、上述注解通过@Import导入了带有注册功能import;在调用bean工厂后置处理器解析配置类时,调用注册方法,注入AbstractAutoProxyCreator
3、在bean实例化前,调用postProcessBeforeInstantiation解析当前bean的切面,有@Aspect注解则为切面类,然后将切点表达式、通知封装成advisor
4、在bean初始化后,调用postProcessAfterInitialization,找到当前bean匹配的advisor,创建动态代理
5、调用:将advisor封装为拦截器链,以责任链形式调用(顺序:AfterThrowing—>AfterReturning–>After–>Before)

事务原理

1、通过注解@EnableTransactionManagement开启
2、上述注解通过@Import导入了ImportSelector,在bean工厂后置处理器解析配置类时调用,注入两个bean
2.1、一个用于注册处理动态代理的bean,若同时开启了aop,则aop的AbstractAutoProxyCreator优先
2.2、一个配置类,用于注入事务的advice、Pointcut切点、事务的advisor、事务属性源、事务管理器等bean
3、在bean实例化前,调用postProcessBeforeInstantiation解析当前bean的切面,找到候选的advisor
4、在bean初始化后,调用postProcessAfterInitialization,通过切点匹配Transactional注解,解析成TransactionAttribute
5、调用:将advisor封装为拦截器链,调用advice方法,try 中回调"连接点(事务的方法)",catch中出现异常回滚事务,正常处理完成则提交事务

@AutoWired 原理

1、注解解析:在bean实例化后,调用AutowiredAnnotationBeanPostProcessor#postProcessMergedBeanDefinition,解析属性和方法上是否有autoWired注解,如果有则封装为InjectionMetadata并加入缓存
2、属性赋值:在属性赋值时,调用AutowiredAnnotationBeanPostProcessor#postProcessPropertyValues,从缓存中获取InjectionMetadata,调用inject方法,若设置在属性上,那么Spring就会先根据属性的类型(byType)去Spring容器找对应类型的bean,找到则通过反射赋值给该属性

invokeBeanFactoryPostProcessors

1、执行手动添加的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry()方法
2、执行扫描出来的BeanDefinitionRegistryPostProcessor(实现了PriorityOrdered)的postProcessBeanDefinitionRegistry()方法
ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry()解析配置类
2.1、解析配置类parse
2.1.1、扫描@ComponentScan
从配置的目录(未配置则用配置类同级目录)下扫描被@Component注解的类,并将BeanDefinition注册到spring容器中
2.1.2、扫描@Import(xxxx.class),xxxx类不同时,处理逻辑不同
a、ImportSelector:则直接调用selectImports
b、ImportBeanDefinitionRegistrar:则将其加入集合中
c、DeferredImportSelector:则将其加入延迟集合中
d、普通的类,不做处理,后续会注册到spring容器中
2.1.3、扫描@Bean的方法
2.1.4、处理延迟的deferredImportSelectors
2.2、@Import导入的类xxxx.class 注册到spring容器中
2.3、@Bean注解的方法注册到spring容器中
2.4、处理ImportBeanDefinitionRegistrar集合,遍历调用registerBeanDefinitions方法
3、执行扫描出来的BeanDefinitionRegistryPostProcessor(实现了Ordered)的postProcessBeanDefinitionRegistry()方法
4、执行扫描出来的BeanDefinitionRegistryPostProcessor(普通)的postProcessBeanDefinitionRegistry()方法
5、执行扫描出来的BeanDefinitionRegistryPostProcessor(所有)的postProcessBeanFactory()方法
6、执行手动添加的BeanFactoryPostProcessor的postProcessBeanFactory()方法
7、执行扫描出来的BeanFactoryPostProcessor(实现了PriorityOrdered)的postProcessBeanFactory()方法
8、执行扫描出来的BeanFactoryPostProcessor(实现了Ordered)的postProcessBeanFactory()方法
9、执行扫描出来的BeanFactoryPostProcessor(普通)的postProcessBeanFactory()方法

BeanPostProcessor和BeanFactoryPostProcessor汇总

beanFactory后置处理器

在这里插入图片描述

BeanFactoryPostProcessor
#postProcessBeanFactory 该方法可以通过bean工厂拿到beanDefinition信息

BeanDefinitionRegistryPostProcessor
#postProcessBeanDefinitionRegistry 可以进行bean定义注册

ConfigurationClassPostProcessor
#postProcessBeanDefinitionRegistry 通过配置类解析bean定义,并进行注册

bean后置处理器

在这里插入图片描述
BeanPostProcessor
#postProcessBeforeInitialization 初始化前调用 @PostCust注解的方法
#postProcessAfterInitialization 初始化后调用 aop和事务都会在这里生存代理对象
实现:AbstractAutoProxyCreator#postProcessAfterInitialization AOP生成代理对象

InstantiationAwareBeanPostProcessor
#postProcessBeforeInstantiation 实例化前调用
实现:AbstractAutoProxyCreator#postProcessBeforeInstantiation AOP解析bean的切面,生成对应的advisor
#postProcessAfterInstantiation 实例化后调用 向bean的成员变量注入自定义的信息
#postProcessPropertyValues 注入属性 @Autowired在这里调用

SmartInstantiationAwareBeanPostProcessor
#determineCandidateConstructors 自定义构造方法
#getEarlyBeanReference 用于解决循环依赖引用 三级缓存的回调接口

MergedBeanDefinitionPostProcessor
#postProcessMergedBeanDefinition 合并bean定义 @AutoWired @Value的注解的预解析

DestructionAwareBeanPostProcessor
#postProcessBeforeDestruction bean销毁处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值