Spring源码剖析-Autowired自动注入原理,java面试网络问题

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<>() 集合中 , 注册顺序如下:

  1. 注册实现了PriorityOrdered 接口的优先级最高的后置处理器

  2. 注册实现了 Ordered接口的有序的后置处理器

  3. 注册常规后置处理器

  4. 注册内部使用的后置处理器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

  • 30
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值