registerBeanPostProcessors(beanFactory, orderedPostProcessors);
// Now, register all regular BeanPostProcessors.
//现在,注册所有常规 BeanPostProcessor。
List nonOrderedPostProcessors = new ArrayList<>();
//
for (String ppName : nonOrderedPostProcessorNames) {
//得到Bean的实例
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
nonOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
//注册常规后置处理器
registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
// Finally, re-register all internal BeanPostProcessors.
sortPostProcessors(internalPostProcessors, beanFactory);
//最后,重新注册所有内部 BeanPostProcessor。
registerBeanPostProcessors(beanFactory, internalPostProcessors);
// Re-register post-processor for detecting inner beans as ApplicationListeners,
// moving it to the end of the processor chain (for picking up proxies etc).
//ApplicationListener检测器,也是一个BeanPostProcessor
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}
这里根据类型:BeanPostProcessor.class
找到了所有的后置处理器,然后通过beanFactory.getBean
创建Bean的实例,根据优先级依次注册到AbstractBeanFactory
中的List<BeanPostProcessor> beanPostProcessors = new CopyOnWriteArrayList<>()
集合中 , 注册顺序如下:
-
注册实现了PriorityOrdered 接口的优先级最高的后置处理器
-
注册实现了 Ordered接口的有序的后置处理器
-
注册常规后置处理器
-
注册内部使用的后置处理器MergedBeanDefinitionPostProcessor
对于AutowiredAnnotationBeanPostProcessor而言,它是属于PriorityOrdered的范畴,优先被注册,我们来看一下他的构造器
public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter
implements MergedBeanDefinitionPostProcessor, PriorityOrdered, BeanFactoryAware {
…省略…
/**
-
Create a new AutowiredAnnotationBeanPostProcessor
-
for Spring’s standard {@link Autowired} annotation.
-
Also supports JSR-330's {@link javax.inject.Inject} annotation, if available.
*/
//为 Spring 的标准Autowired注释创建一个新的 AutowiredAnnotationBeanPostProcessor
@SuppressWarnings(“unchecked”)
public AutowiredAnnotationBeanPostProcessor() {
//增加要注入的注解类型
this.autowiredAnnotationTypes.add(Autowired.class);
this.autowiredAnnotationTypes.add(Value.class);
try {
//支持 JSR-330 的javax.inject.Inject注释
this.autowiredAnnotationTypes.add((Class<? extends Annotation>)
ClassUtils.forName(“javax.inject.Inject”, AutowiredAnnotationBeanPostProcessor.class.getClassLoader()));
logger.info(“JSR-330 ‘j