准备工作启动Springrefresh()finishBeanFactoryInitialization(beanFactory)preInstantiateSingletons()createBean(beanName, mbd, args)
第一次调用BeanPostProcessor doCreateBean()
createBeanInstance()
第二次调用BeanPostProcessor 第三次调用BeanPostProcessor第四次BeanPostProcessorpopulateBean()
第五次调用BeanPostProcessor第六次调用BeanPostProcessor initializeBean()
第七次调用BeanPostProcessorinvokeInitMethods()第八次调用BeanPostProcessor 第九次调用BeanFactoryProcessor总结
准备工作使用的是Spring5.0的源码准备一个BeanTest的测试类
启动Spring
refresh()方法是Spring的启动方法,我们启动它
refresh()
BeanPostProcessor会在registerBeanPostProcessors(beanFactory)注册到工厂中去我们主要看finishBeanFactoryInitialization(beanFactory)方法,这个方法是用来实例化非懒加载的Bean
finishBeanFactoryInitialization(beanFactory)
下边这个方法是真正开始实例化Bean
preInstantiateSingletons()
这个方法就是首先将所有的BeanName方法集合,然后遍历通过getBean(beanName)这个方法来获取Bean,因为我的BeanTest不是FactoryBean所以走下班的getBean(beanName)
进入getBean后是一个doGetBean方法然后再点进去
代码太多就直接找到关键方法吧,就是调用getSingleton()然后传入了beanName和一个Lambda表达式,我们进去看这个getSingleton()方法
加锁然偶胡在单例池中再次get一个,防止被创建过,如果没有则进入创建流程通过getObject()调用Lambda表达式开始创建对象,然后上个方法进入createBean(beanName, mbd, args)
createBean(beanName, mbd, args)
首先找到这个方法,这是第一次调用BeanPostProcessor
第一次调用BeanPostProcessor
这里会调用方法applyBeanPostProcessorsBeforeInstantiation,如果这个方法返回一个对象,那么就会继续走applyBeanPostProcessorsAfterInitialization方法然后直接把这个对象加入单例池中,也就是这个对象已经走完生命周期这里Spring允许我们返回一个代理对象,然后直接不走Spring的流程
如果没有返回对象那么流程继续,会走到doCreateBean()方法
doCreateBean()
进入方法后会看到createBeanInstance方法,顾名思义这就是创建Bean实例的地方
createBeanInstance()
我们进入到这个方法以后能找到第二个BeanPostProcessor调用的地方这里是如果是有参构造则会走autowireConstructor方法进行解析实例化如果无参则走instantiateBean进行实例化然后返回doCreateBean方法
第二次调用BeanPostProcessor
进去之后发现如果实现了SmartInstantiationAwareBeanPostProcessor这个子类类型才允许对Bean做修改这一步是用来推断Bean的构造方法,实际做事情的类是AutowiredAnnotationBeanPostProcessor
然后紧接着会看到第三个BeanPostProcessor被调用
第三次调用BeanPostProcessor
这次是要实现了MergedBeanDefinitionPostProcessor的子类才可以对Bean进行处理这步主要做的事情就是AutowiredAnnotationBeanPostProcessor解析类中有没有使用@Autowired和@Value等CommonAnnotationBeanPostProcessor解析有没有@Resource注解等,还会调用父类去解析有没有@PostConstruct方法等解析完以后会封装成一个对象然后放到自己维护的一个Map缓存中,后边会进行处理
第四次BeanPostProcessor
这一步并没有调用,会首先判断是否支持循环依赖,如果支持会把一个Lambda表达式放入三级缓存中三级缓存是用来解决循环依赖问题的,如果循环依赖那么会调用这个表达式然后BeanPostProcessor会对Bean进行处理
接着我们会看到两个很重要的方法,
populateBean()
这个方法主要是对属性进行了注入进来以后就会看到再次调用了BeanPostProcessor 第五次调用BeanPostProcessor
这一步中实现了BeanPostProcessor的子类InstantiationAwareBeanPostProcessor才能对Bean进行操作,Spring默认没有动作这里也是第一次调用BeanPostProcessor时如果返回不为null就会调用这个方法,自行扩展这个方法如果返回false则不会进行下一步的属性装配,默认返回的都是true
我们继续往下走就会看到第六个BeanPostProcessor
第六次调用BeanPostProcessor
第六步就是上边第三步处理好@Autodwred或@Resource等注解后会调用BeanPostProcessor对需要注入的属性进行注入啊等等如果有循环依赖就会调用那个放入三级缓存中的BeanPostProcessor
initializeBean()
这一步是主要初始化Bean进来以后首先会调用三个Aware方法
然后会第七次调用BeanPostProcessor
第七次调用BeanPostProcessor
这里就是调用所有的BeanPostProcessor都对Bean进行操作,@PostConstruct就是在这里被调用的Spring还会对实现了特定Aware接口的类进行操作
然后回到原来的方法,这里调用了afterPropertiesSet方法和initMethod
invokeInitMethods()
进来判断有没有实现InitializingBean,如果实现了就调用afterPropertiesSet方法下边还会调用initMethod方法
然后会再次调用BeanPostProcessor
第八次调用BeanPostProcessor
Aop在这一步进行了代理
然后这些步骤走完以后就会放入一级缓存也就是单例池中,一个对象的初始化就完成了
第九次调用BeanFactoryProcessor
第九次是BeanFacoty调用destroyBean删除Bean时会进行调用,这里就不带大家看了,有兴趣的可以研究一下 总结
声明周期主要流程:
准备创建Bean第一次调用BeanPostProcessor,判断是否为其生成代理对象,如果生成退出流程,不生成继续往下开始创建Bean第二次调用,推断出构造方法第三次调用,获取需要解析的注解如@Autowired等将半成品对象以Lambda表达式形式放入三级缓存,后边如果有循环依赖则会第四次调用准备装配属性第五次调用,允许返回false来不进行属性装配,直接开始初始化,默认为true第六次调用,通过第三次解析的数据来对Bean进行装配准备初始化先调用三个Aware方法第七次调用,@PostConstruct在这里被调用在调用afterPropertiesSet和InitMethod方法第八次调用,自己实现放入一级缓存也就是单例池中调用方法开始销毁Bean第九次调用,删除所有缓存 BeanPostProcessor方法调用:
- 允许返回一个对象直接结束初始化流程,例如返回一个代理对象
InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation解析最合适的构造方法,如果有需要注入的参数会进行解析
SmartInstantiationAwareBeanPostProcessor.determineCandidateConstructors解析@Autowired,@Value,@Resources,@PostConstruct等注解以便后边使用
MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition为了解决循环依赖会放入三级缓存,可以对三级缓存中的函数式接口返回代理对象 SmartInstantiationAwareBeanPostProcessor.getEarlyBeanReferencespring没有实现,默认返回值为true,如果返回false那么不进行属性注入,自己扩展 InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation属性注入@Autowired,@Resources等
InstantiationAwareBeanPostProcessor.postProcessPropertiesspring对特定的类进行了操作,自行实现
BeanPostProcessor.postProcessBeforeInitializationAop在这一步实现
BeanPostProcessor.postProcessAfterInitialization删除bean的操作,自行实现 DestructionAwareBeanPostProcessor.requiresDestruction



