入口,先处理有排序的
beanPostProssors,再处理无序的beanPostProssors
org.springframework.context.support.AbstractApplicationContext#registerBeanPostProcessors
----》
调用这个方法进行创建bean的流程
org.springframework.beans.factory.BeanFactory#getBean(java.lang.String, java.lang.Class)
----》
org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean
—》
将这个beanName的ObjectFactory进行处理
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, org.springframework.beans.factory.ObjectFactory<?>)
–》
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#beforeSingletonCreation
这个是往
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#singletonsCurrentlyInCreation 这个集合里面放正在创建中的bean
–》
然后执行ObjectFactory的getObject方法也就是执行
org.springframework.beans.factory.support.AbstractBeanFactory#createBean
–》
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean
—》
这里发现这个bean正在创建过程中的单例bean,那么就将这个这个bean放到org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#singletonFactories 这个第三级缓存创建工厂中
// Eagerly cache singletons to be able to resolve circular references
// even when triggered by lifecycle interfaces like BeanFactoryAware.
boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
isSingletonCurrentlyInCreation(beanName));
if (earlySingletonExposure) {
if (logger.isTraceEnabled()) {
logger.trace(“Eagerly caching bean '” + beanName +
“’ to allow for resolving potential circular references”);
}
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
}
—》
然后开始填充属性
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean
—》
然后通过这个方法,去寻找要添加的属性的单例bean
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor#postProcessProperties
—》
经过一系列的调用,找到这个方法
org.springframework.beans.factory.config.DependencyDescriptor#resolveCandidate
–》
然后又走到了 getBean方法,然后又开始了bean的创建循环
到这里beanPostProcessor的创建注入过程结束了,然后才会去创建正常注入spring的bean
实际的方法还是在正常的这个入口进入
org.springframework.context.support.AbstractApplicationContext#onRefresh