spring源码:注册后置处理器

目的

程序员在对spring扩展的时候,可以自己实现后置处理器,完成特定的业务操作,该篇博客,主要是学习spring如何将程序员提供的后置处理器添加到spring容器中的;
顺带,将spring初始化流程中,其他几个方法做一个大致的解析和介绍

源码学习

registerBeanPostProcessors(beanFactory);

该方法是用来完成,注册BeanPostProcessor实现类的
如果我们自己实现了BeanPostProcessor接口,并提供了自己的业务处理逻辑,spring首先会把我们提供的BeanPostProcessor实现类,在实例化业务bean之前,先实例化,并存入特定的集合中;

org.springframework.context.support.AbstractApplicationContext#registerBeanPostProcessors

这个方法,就是用来处理后置处理器的
所以:这个方法归结而言,就完成了两件事情

  1. 把所有的BeanPostProcessor(包括spring自己的 + 我们提供的)进行初始化,并存入到spring容器中(signletonObjects这个集合中)
  2. 把所有的BeanPostProcessor存入到一个list中(private final List<BeanPostProcessor> beanPostProcessors = new CopyOnWriteArrayList<>();
public static void registerBeanPostProcessors(
    ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {

  /**
 * 1.获取到所有实现了beanPostProcessor接口的实现类的name,从beanDefinitionMaps中获取
 *  这里在从BeanDefinitionMap中获取BeanPostProcessor类型的实现类的时候,会进行bean的合并,也即:将bean转换Wie
   */
  String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

  // Register BeanPostProcessorChecker that logs an info message when
  // a bean is created during BeanPostProcessor instantiation, i.e. when
  // a bean is not eligible for getting processed by all BeanPostProcessors.
  int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
  beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

  // Separate between BeanPostProcessors that implement PriorityOrdered,
  // Ordered, and the rest.
  /**
 * 2.internalPostProcessors:存储的是实现了MergedBeanDefinitionPostProcessor接口的实现类
 * 这里没想明白为什么要把实现了该接口的实现类单独存储
   */
  List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
  List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
  List<String> orderedPostProcessorNames = new ArrayList<>();
  List<String> nonOrderedPostProcessorNames = new ArrayList<>();
  /**
 * 3.按照后置处理器实现的ordered接口 分别存到不同的集合中
   */
  for (String ppName : postProcessorNames) {
    if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
      /**
       * 4.在调用getBean的时候,就会调用对应的初始化方法,完成对beanPostProcessor的初始化
       */
      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);
    }
  }

  // First, register the BeanPostProcessors that implement PriorityOrdered.
  sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
  /**
 * 5.registerBeanPostProcessors:该方法,就是把入参中的beanPostProcessor实现类存入到beanPostProcessors这个list集合中
   */
  registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

  // Next, register the BeanPostProcessors that implement Ordered.
  List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>();
  for (String ppName : orderedPostProcessorNames) {
    BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
    orderedPostProcessors.add(pp);
    if (pp instanceof MergedBeanDefinitionPostProcessor) {
      internalPostProcessors.add(pp);
    }
  }
  sortPostProcessors(orderedPostProcessors, beanFactory);
  registerBeanPostProcessors(beanFactory, orderedPostProcessors);

  // Now, register all regular BeanPostProcessors.
  List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
  for (String ppName : nonOrderedPostProcessorNames) {
    BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
    nonOrderedPostProcessors.add(pp);
    if (pp instanceof MergedBeanDefinitionPostProcessor) {
      internalPostProcessors.add(pp);
    }
  }
  registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);

  sortPostProcessors(internalPostProcessors, beanFactory);
  registerBeanPostProcessors(beanFactory, internalPostProcessors);

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

这里的逻辑还是比较简单的,但是与几个点需要注意:

  • 在第一点:从beanDefinitionMap中获取beanPostProcessor的实现类的时候,会对beanDefinition进行一次合并(将beanDefinition合并为RootBeanDefinition,这里的合并bean,在后面的博客中进行说明,这里暂时记一下就好)
  • 在获取到所有的BeanPostProcessor实现类的时候,会对实现类进行优先级的分类,实现了PriorityOrdered > 实现了Ordered > 普通的实现类
  • registerBeanPostProcessors(beanFactory, internalPostProcessors);该方法就是将实例化好的BeanPostProcessor实现类放入到beanPostProcessors这个集合中
  • 在调用getBean()方法的时候,会从单实例池中尝试获取bean,如果bean不存在,就初始化、实例化;也即:在源码中第4点这里,会完成对beanPostProcessor的实例化(意思就是说:经过第4点之后,我们自己提供的beanPostProcessor和spring自己的后置处理器已经走完了整个生命周期流程,是一个合格的bean了)

initMessageSource();

这个方法,暂时还没来得及看,百度了一下,说是用来做国际化、消息绑定等,这里待后面学习之后再补充

initApplicationEventMulticaster();

在这个方法中,初始化了一个多事件派发器ApplicationEventMulticaster,用来做事件发布的

onRefresh();

这是一个扩展方法,在spring framework中是一个空方法,留给子接口进行扩展,其中:springboot启动的源码中,就对该方法做了扩展

registerListeners();

看名字,是用来注册事件监听器的,暂时未学习

finishBeanFactoryInitialization(beanFactory);

这是完成bean实例化的重要方法,在后面会介绍这个方法中的每个核心方法

finishRefresh();

在完成spring的初始化之后,发布ContextRefreshedEvent事件,当然,还有其他的操作,这个方法,也没有做过多的学习,待后面补充吧

接下来,我主要想分享的是finishBeanFactoryInitialization这个方法,这个方法中,是spring将扫描之后的beanDefinition初始化为bean对应,并存入到spring容器中的核心方法

猜你喜欢

转载自blog.csdn.net/CPLASF_/article/details/107302606