Back to Javatutorial

Spring启动流程(六):注册BeanPostProcessor

docs/Spring全家桶/Spring源码分析/Spring启动流程/Spring启动流程(六):注册BeanPostProcessor.md

1.0.05.9 KB
Original Source

ģǼ

6. ע BeanPostProcessor: registerBeanPostProcessors(beanFactory)

ʽǰҪȷ

  • BeanFactoryPostProcessorΪ BeanFactory ĺôԶ BeanFactory һЩ
  • BeanPostProcessorΪ Bean ĺôԶ Bean һЩ

Ҫĵ BeanPostProcessor ǰ BeanFactoryPostProcessor Ūˡ

ҪǶ BeanPostProcessor register (registerBeanPostProcessors(beanFactory)) BeanPostProcessor עᵽ BeanFactory УôʲôʱأȻǶ Bean IJȻ bean ֮ˡ

BeanPostProcessor Ҳ spring һҪڸϸԲο spring ֮ BeanPostProcessors

ϻ˵ֱϴ룬ͬأԲҪķֻ

|-AbstractApplicationContext#refresh
 |-AbstractApplicationContext#registerBeanPostProcessors
  |-PostProcessorRegistrationDelegate
    #registerBeanPostProcessors(ConfigurableListableBeanFactory, AbstractApplicationContext)

յõ PostProcessorRegistrationDelegate#registerBeanPostProcessors£

public static void registerBeanPostProcessors(
        ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {

    // ȡspringе BeanPostProcessorһbean: 
    // org.springframework.context.annotation.internalAutowiredAnnotationProcessor
    //  AutowiredAnnotationBeanPostProcessor
    String[] postProcessorNames = beanFactory
            .getBeanNamesForType(BeanPostProcessor.class, true, false);

    int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() 
            + 1 + postProcessorNames.length;
    beanFactory.addBeanPostProcessor(
            new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

    List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
    List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
    List<String> orderedPostProcessorNames = new ArrayList<>();
    List<String> nonOrderedPostProcessorNames = new ArrayList<>();

    // ȻȡʵPriorityOrderedBeanPostProcessor
    // ٻȡʵOrderedBeanPostProcessor
    // ٻȡBeanPostProcessor
    for (String ppName : postProcessorNames) {
        if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
            BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
            priorityOrderedPostProcessors.add(pp);
            if (pp instanceof MergedBeanDefinitionPostProcessor) {
                internalPostProcessors.add(pp);
            }
        }
        else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
            orderedPostProcessorNames.add(ppName);
        }
        else {
            nonOrderedPostProcessorNames.add(ppName);
        }
    }

    // priorityOrderedPostProcessorȻӵbeanFactory
    sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
    registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

    List<BeanPostProcessor> orderedPostProcessors 
            = new ArrayList<>(orderedPostProcessorNames.size());
    for (String ppName : orderedPostProcessorNames) {
        BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
        orderedPostProcessors.add(pp);
        if (pp instanceof MergedBeanDefinitionPostProcessor) {
            internalPostProcessors.add(pp);
        }
    }
    // orderedPostProcessorȻӵbeanFactory
    sortPostProcessors(orderedPostProcessors, beanFactory);
    registerBeanPostProcessors(beanFactory, orderedPostProcessors);

    List<BeanPostProcessor> nonOrderedPostProcessors 
            = new ArrayList<>(nonOrderedPostProcessorNames.size());
    for (String ppName : nonOrderedPostProcessorNames) {
        BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
        nonOrderedPostProcessors.add(pp);
        if (pp instanceof MergedBeanDefinitionPostProcessor) {
            internalPostProcessors.add(pp);
        }
    }
    // µBeanPostProcessorȻӵbeanFactory
    registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);    
    // internalPostProcessorȻӵbeanFactory
    // AutowiredAnnotationBeanPostProcessorʵMergedBeanDefinitionPostProcessor
    // ٴע
    sortPostProcessors(internalPostProcessors, beanFactory);
    registerBeanPostProcessors(beanFactory, internalPostProcessors);

    beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}

ҪǶ BeanFactoryPostProcessor ע£

  • ʵ PriorityOrdered BeanPostProcessor עᵽ beanFactory У
  • ʵ Ordered BeanPostProcessor עᵽ beanFactory У
  • BeanPostProcessor עᵽ beanFactory У
  • ʵ MergedBeanDefinitionPostProcessor BeanPostProcessor ٴעᵽ beanFactory С

ʵϣ demo01 ԣע bean ֻһAutowiredAnnotationBeanPostProcessorͬʱʵ MergedBeanDefinitionPostProcessor PriorityOrdered˻עΡ

ע˶ AutowiredAnnotationBeanPostProcessorֻһǽ registerBeanPostProcessors spring עģһ·ȥ뵽 AbstractBeanFactory#addBeanPostProcessor:

AbstractBeanFactory#addBeanPostProcessor

private final List<BeanPostProcessor> beanPostProcessors = new CopyOnWriteArrayList<>();

@Override
public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
    Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null");
    // ȽƳ˶עbeanPostProcessorsҲֻһ
    this.beanPostProcessors.remove(beanPostProcessor);
    if (beanPostProcessor instanceof InstantiationAwareBeanPostProcessor) {
        this.hasInstantiationAwareBeanPostProcessors = true;
    }
    if (beanPostProcessor instanceof DestructionAwareBeanPostProcessor) {
        this.hasDestructionAwareBeanPostProcessors = true;
    }
    this.beanPostProcessors.add(beanPostProcessor);
}

Կνעᵽ BeanFactoryʵǰ beanPostProcessorBeanFactory beanPostProcessors С

Ľ beanPostProcessor עᣬ beanPostProcessor ĵãķᵽĵķȵɣ


ԭӣhttps://my.oschina.net/funcy/blog/4657181 ߸ˮƽд֮ӭָԭףҵתϵ߻Ȩҵתע