一、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.加入一级缓存中