spring bean生命周期

一、spring bean实例化之前:

类被扫描(configurationClassPostProcessor),每扫描到一个符合规则的类之后解析成一个的beanDefinition,invokeBeanFactoryPostProcessor之前beanDefinitionMap只有自己的开天辟地的类和自己的配置类(配置类在register()时解析成beanDefinition)

 
接着beanDefinition放入beanDefinitionMap中key=beanName,value=beanDefinition,在执行invokeBeanFactoryPostProcessors(回调beanfactory后置处理器有2种个接口,按顺序是先BeanDefinitionRegistryPostProcessor后BeanFactoryPostProcessor)

spring注解模式下如何扫描配置类和注解(@ComponentScan,@import,@Bean等)扫描后符合的类为beanDefinition的:


先明确一点在invokeBeanFactoryPostProcessors后类成为beanDefinition(除去1.开山辟地类和2.配置类 在之前就已经解析完成)

注意:this.scanner = new ClassPathBeanDefinitionScanner(this); 只是个对象让程序员可以手动进行扫描(如手动添加扫描配置类)


1.对于开山辟地类:this()->AnnotatedBeanDefinitionReader->registerAnnotationConfigProcessors->beanDefs.add(开山辟地类)
2.对于配置类:register(componentClasses) 



开山辟地类中有一个ConfigurationClassPostProcessor被解析到了beanDefinitionMap中


一、执行到invokeBeanFactoryPostProcessors中会拿到实现了BeanDefinitionRegistryPostProcessor的类,此时ConfigurationClassPostProcessor被拿到后执行接口方法postProcessBeanDefinitionRegistry
二、processConfigBeanDefinitions->checkConfigurationClassCandidate->parse->根据是否是注解类、是否import等进行解析成beanDefinition


比如@ComponentScan ,最后又new了一个ClassPathBeanDefinitionScanner、doScan去获得@ComponentScan路径下的类,再把符合规则(@Component、@Service等)的类解析为beanDefinition.


@ComponentScan 首先处理 
@import,@Bean 先定义,后面在处理





问题

加不加@configuration的区别:cglib动态代理?不懂,后面有时间研究一下

bean覆盖:同一个scan下2个相同名字会报错,但configuration中@Bean不会报错,因为@Bean是后面解析的会覆盖。


最后执行到finishBeanFactoryInitialization#preInstantiateSingletons后生成bean放入sping单例池(一级缓存)中。


二、spring bean实例化过程:

一些描述:

beanDefinitionMap在DefaultListableBeanFactory(bean工厂)里面

beanDefinitionMap -> 存的(key,beanDefinition)  描述bean的组件

spring单例池(一级缓存):singletonObjects

invokeBeanFactoryPostProcessor之后这时所有的bean定义已经保存加载到beanFactory,但是bean的实例还未创建,回调beanfactory后置处理器

registerBeanPostProcessors 仅仅是注册bean的后置处理器


finishBeanFactoryInitialization->preInstantiateSingletons->isFactoryBean(FactoryBean:实现这个接口的bean成为工厂bean,最后从ioc容器中拿到的会是getObject方法的返回值,可以加上$符号获取到原本的bean)

getBean() 一级缓存中拿,拿到返回,没拿到执行createBean()


执行第一次后置处理器:给程序员一个自己返回bean的机会  Object bean = resolveBeforeInstantiation(beanName, mbdToUse),判断有无实现了此接口:InstantiationAwareBeanPostProcessors,执行接口的postProcessBeforeInstantiation方法

如果有直接返回实现接口中的bean,如果没有则执行


1.doCreateBean()创建
    1.反射 beanDefinition中的beanclass -默认无参构造函数
    2.工厂模式    @bean方式创建的bean

详细请看:https://blog.youkuaiyun.com/qq_37694903/article/details/116244603

org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessBeforeInstantiation 解析所有的bean,@Aspect配置类中的每一个增强相关的方法都会被生成一个advisor。

执行第二次后置处理器:TODO

执行第三次后置处理器:doCreateBean中会执行applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);

有实现的后置处理器AutowiredAnnotationBeanPostProcessor主要用于处理@Autowired注解,只是去解析@Autowired注解生成一个个的注入元信息,还没有真正开始进行注入,真正注入的逻辑在后面populateBean方法中,在这个方法中会使用解析好的注入元信息完成真正的属性注入

执行第四次后置处理器:(只是添加进三级缓存中,并不是在此处调用执行)循环依赖中三级工厂缓存生成AOP代理对象 在createBeanInstance中的getEarlyBeanReference方法中判断有无实现了此接口:SmartInstantiationAwareBeanPostProcessor执行接口的getEarlyBeanReference方法


2.populateBea()属性赋值

执行第六次后置处理器:处理依赖注入 @Autowired(AutowiredAnnotationBeanPostProcessor) 和 @Resource(CommonAnnotationBeanPostProcessor)

判断有无实现了此接口:InstantiationAwareBeanPostProcessor,执行接口的postProcessProperties方法-> org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.AutowiredFieldElement#inject

-> beanFactory.resolveDependency(desc, beanName, autowiredBeanNames, typeConverter); -> doGetBean

3.initializeBean()初始化 ->BeanPostProcessors和Aware接口和生命周期回调函数也是在这里触发

执行第七次后置处理器:before后置处理器

执行第八次后置处理器:after后置处理器:除了循环依赖外的AOP动态代理对象在此处创建

执行第九次后置处理器:TODO

4.加入一级缓存中


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值