Spring IOC源码:invokeBeanFactoryPostProcessors 后置处理器详解

简介: Spring IOC源码:invokeBeanFactoryPostProcessors 后置处理器详解

文章目录

Spring源码系列:

前言

正文

方法1:prepareBeanFactory

方法2:postProcessBeanFactory

方法3:invokeBeanFactoryPostProcessors

方法4:getBeanFactoryPostProcessors()

方法5:invokeBeanFactoryPostProcessors

方法6:sortPostProcessors

总结

Spring源码系列:

Spring IOC源码:简单易懂的Spring IOC 思路介绍

Spring IOC源码:核心流程介绍

Spring IOC源码:ApplicationContext刷新前准备工作

Spring IOC源码:obtainFreshBeanFactory 详解(上)

Spring IOC源码:obtainFreshBeanFactory 详解(中)

Spring IOC源码:obtainFreshBeanFactory 详解(下)

Spring IOC源码:<context:component-scan>源码详解

Spring IOC源码:invokeBeanFactoryPostProcessors 后置处理器详解

Spring IOC源码:registerBeanPostProcessors 详解

Spring IOC源码:实例化前的准备工作

Spring IOC源码:finishBeanFactoryInitialization详解

Spring IoC源码:getBean 详解

Spring IoC源码:createBean( 上)

Spring IoC源码:createBean( 中)

Spring IoC源码:createBean( 下)

Spring IoC源码:finishRefresh 完成刷新详解

前言

前面篇幅介绍了Bean配置的解析过程,包括注解、xml配置文件的解析。下面进入refresh方法中另一个重要的节点,即BeanFactoryPostProcessor的注册及其执行过程。

正文

进入refresh,前面篇幅已经介绍了obtainFreshBeanFactory(),接下来进入

public void refresh() throws BeansException, IllegalStateException {
    synchronized (this.startupShutdownMonitor) {
      // 容器刷新前准备工作
      prepareRefresh();
      // Tell the subclass to refresh the internal bean factory.
      //创建Bean工厂,解析配置
      ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
      // bean工厂准备工作
      prepareBeanFactory(beanFactory);
      try {
        //拓展接口,留给子类进行实现拓展
        postProcessBeanFactory(beanFactory);
        // 注册执行,BeanFactoryPostProcessor
        invokeBeanFactoryPostProcessors(beanFactory);
        // 注册创建BeanPostProcessor
        registerBeanPostProcessors(beanFactory);
        // 这个方法主要作用就是使用国际化,定制不同的消息文本,比如定义了一个Person的Bean,它有name属性,我们需要在不同的国家展示对应国家所在语言名称,这时候就可以使用国际化了。
        initMessageSource();
        // Initialize event multicaster for this context.
        //初始化应用事件广播器
        initApplicationEventMulticaster();
        // Initialize other special beans in specific context subclasses.
        //拓展接口,留给子类进行实现拓展,springboot就对该方法进行了处理
        onRefresh();
        // Check for listener beans and register them.
        //将内部的、以及我们自定义的监听器添加到缓存中,为后续逻辑处理做准备。还有添加事件源到缓存中。
        registerListeners();
        // Instantiate all remaining (non-lazy-init) singletons.
        //实例化剩下非懒加载的Bean
        finishBeanFactoryInitialization(beanFactory);
        // Last step: publish corresponding event.
        //使用应用事件广播器推送上下文刷新完毕事件(ContextRefreshedEvent )到相应的监听器。
        finishRefresh();
      }
      catch (BeansException ex) {
        if (logger.isWarnEnabled()) {
          logger.warn("Exception encountered during context initialization - " +
              "cancelling refresh attempt: " + ex);
        }
        // Destroy already created singletons to avoid dangling resources.
        //执行相关销毁方法
        destroyBeans();
        // Reset 'active' flag.
        //重置上下文刷新状态
        cancelRefresh(ex);
        // Propagate exception to caller.
        throw ex;
      }
      finally {
        // Reset common introspection caches in Spring's core, since we
        // might not ever need metadata for singleton beans anymore...
        resetCommonCaches();
      }
    }
  }

prepareBeanFactory(beanFactory),见方法1详解

postProcessBeanFactory(beanFactory),见方法2详解

invokeBeanFactoryPostProcessors(beanFactory),见方法3详解

方法1:prepareBeanFactory

  protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
    // 为当前Bean工厂设置类加载器
    beanFactory.setBeanClassLoader(getClassLoader());
    beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
    beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
    //添加BeanPostProcessor后置处理器
    beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
    //跳过以下6个属性的自动注入
    //因为在ApplicationContextAwareProcessor后置处理器中通过setter注入
    beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
    beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
    beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
    beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
    beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
    beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
    /**
     * 在Spring自动装配的时候如果一个接口有多个实现类,并且都已经放到IOC中去了,
     * 那么自动装配的时候就会出异常,因为spring不知道把哪个实现类注入进去,
     * 但是如果我们自定义一个类,然后实现BeanFactoryPostProcessor接口
     * 在该阶段调用这个方法,如果哪个地方要自动注入这个类型的对象的话,那么就注入进去我们指定的对象
    */
    beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
    beanFactory.registerResolvableDependency(ResourceLoader.class, this);
    beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
    beanFactory.registerResolvableDependency(ApplicationContext.class, this);
    // Register early post-processor for detecting inner beans as ApplicationListeners.
    注册事件监听器
    beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
    //如果当前BeanFactory包含loadTimeWeaver Bean,说明存在类加载期织入AspectJ,则把当前BeanFactory交给类加载期BeanPostProcessor实现类LoadTimeWeaverAwareProcessor来处理,从而实现类加载期织入AspectJ的目的。
    if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
      beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
      // Set a temporary ClassLoader for type matching.
      beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
    }
    // 将以下Bean添加到一级缓存中
    if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
      beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
    }
    if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
      beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
    }
    if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
      beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
    }
  }

方法2:postProcessBeanFactory

  protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
  }

这个方法没有实现内容,为拓展接口,留给子类实现。我们可以看到这个方法的参数为bean工厂对象,意味着我们可以往该工厂中添加后置处理器或者添加忽略类,在后续注入中跳过。也可以往三级缓存中添加信息。

例如:

  protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
    if (this.servletContext != null) {
      beanFactory.addBeanPostProcessor(new ServletContextAwareProcessor(this.servletContext));
      beanFactory.ignoreDependencyInterface(ServletContextAware.class);
    }
    WebApplicationContextUtils.registerWebApplicationScopes(beanFactory, this.servletContext);
    WebApplicationContextUtils.registerEnvironmentBeans(beanFactory, this.servletContext);
  }

方法3:invokeBeanFactoryPostProcessors

  protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
    //执行BeanFactoryPostProcessors
    PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
    // Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
    // (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
    if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
      beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
      beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
    }
  }

getBeanFactoryPostProcessors(),见方法4详解

invokeBeanFactoryPostProcessors(),见方法5详解

方法4:getBeanFactoryPostProcessors()

  public List<BeanFactoryPostProcessor> getBeanFactoryPostProcessors() {
    return this.beanFactoryPostProcessors;
  }

我们看到这里是直接返回当前上下文的beanFactoryPostProcessors集合,默认情况下这里是空的,那我们如何自定义一个后置处理器并且往该集合存放呢?我们可以自定义ClassPathXmlApplicationContext子类,重写上述介绍的方法2postProcessBeanFactory方法,并往beanFactoryPostProcessors添加自定义后置处理器;


创建工厂后置处理器

package controller.main;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
  @Override
  public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    Object teacher = beanFactory.getBean("teacher");
    System.out.println(teacher);
  }
}

自定义ClassPathXmlApplicationContext子类,并添加后置处理器

package controller.main;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyClassPathApplicationContext extends ClassPathXmlApplicationContext {
  public MyClassPathApplicationContext(String path){
    super(path);
  }
  @Override
  protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
    this.addBeanFactoryPostProcessor(new MyBeanFactoryPostProcessor());
  }
}

启动测试

public class PersonTest {
  public static void main(String[] args) {
    MyClassPathApplicationContext applicationContext=new MyClassPathApplicationContext("application-scan.xml");
    StudentDao zdcDomain = (StudentDao) applicationContext.getBean("studentDao");
    System.out.println(zdcDomain);
  }
}

040bd7286ead3d3e4095881ddeb84709_7c682d4a7e964d21a11e733e0aad4c4e.png

方法5:invokeBeanFactoryPostProcessors

public static void invokeBeanFactoryPostProcessors(
      ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
    // 存放BeanDefinitionRegistryPostProcessor类型已经执行过其postProcessBeanDefinitionRegistry方法的beanName
    Set<String> processedBeans = new HashSet<>();
    if (beanFactory instanceof BeanDefinitionRegistry) {
      BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
      //存放普通的PostProcessors,就是非BeanDefinitionRegistryPostProcessor类型的
      List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
      //存放BeanDefinitionRegistryPostProcessor类型的处理器
      List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
      //遍历上下文中的beanFactoryPostProcessors集合,也就是我们在方法4中设置进去的后置处理器集合
      for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
        if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
          BeanDefinitionRegistryPostProcessor registryProcessor =
              (BeanDefinitionRegistryPostProcessor) postProcessor;
          //执行postProcessBeanDefinitionRegistry方法
          registryProcessor.postProcessBeanDefinitionRegistry(registry);
          //添加到集合中
          registryProcessors.add(registryProcessor);
        }
        else {
          //添加到普通后置处理器集合中
          regularPostProcessors.add(postProcessor);
        }
      }
      // Do not initialize FactoryBeans here: We need to leave all regular beans
      // uninitialized to let the bean factory post-processors apply to them!
      // Separate between BeanDefinitionRegistryPostProcessors that implement
      // PriorityOrdered, Ordered, and the rest.
      //存放当前节点的集合
      List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
      // First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
      //获取我们bean工厂中类型为BeanDefinitionRegistryPostProcessor的beanName
      String[] postProcessorNames =
          beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
      for (String ppName : postProcessorNames) {
        //判断是否实现了PriorityOrdered接口
        if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
          //添加到当前节点中
          currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
          //添加名称到集合中
          processedBeans.add(ppName);
        }
      }
      //排序
      sortPostProcessors(currentRegistryProcessors, beanFactory);
      //将当前节点的后置处理器添加到registryProcessors集合中
      registryProcessors.addAll(currentRegistryProcessors);
      //执行postProcessBeanDefinitionRegistry方法
      invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
      //清空当前节点集合
      currentRegistryProcessors.clear();
      // Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
      //重新获取类型为BeanDefinitionRegistryPostProcessor的beanName,为什么这里要重新获取一次,
      //我理解就是上面执行了post ProcessBeanDefinitionRegistry方法,可能存在往bean工厂中添加类型为
      //BeanDefinitionRegistryPostProcessor的BeanDefinition封装对象,所以这里算是更新数据吧
      postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
      for (String ppName : postProcessorNames) {
        //判断执行过的processedBeans集合中不存在,并且实现了Ordered接口
        if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
          //添加到当前节点中
          currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
          //添加名称到已执行集合中
          processedBeans.add(ppName);
        }
      }
      //排序
      sortPostProcessors(currentRegistryProcessors, beanFactory);
      //将当前节点的后置处理器添加到registryProcessors集合中
      registryProcessors.addAll(currentRegistryProcessors);
      //执行postProcessBeanDefinitionRegistry方法
      invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);    
      //清空当前节点集合
      currentRegistryProcessors.clear();
      // Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
      boolean reiterate = true;
      while (reiterate) {
        reiterate = false;
        //获取类型BeanDefinitionRegistryPostProcessor的beanName
        postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
        //这里主要获取没有实现PriorityOrdered和Order类的后置处理器
        for (String ppName : postProcessorNames) {
          if (!processedBeans.contains(ppName)) {
            currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
            processedBeans.add(ppName);
            reiterate = true;
          }
        }
        sortPostProcessors(currentRegistryProcessors, beanFactory);
        registryProcessors.addAll(currentRegistryProcessors);
        invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
        currentRegistryProcessors.clear();
      }
      // 执行postProcessBeanFactory(beanFactory)方法
      invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
      invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
    }
    else {
      // Invoke factory processors registered with the context instance.
      //没有实现BeanDefinitionRegistry接口的,直接执行postProcessBeanFactory(beanFactory)方法
      invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
    }
    // Do not initialize FactoryBeans here: We need to leave all regular beans
    // uninitialized to let the bean factory post-processors apply to them!
    String[] postProcessorNames =
        beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
    // Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
    // Ordered, and the rest.
    //存放实现了PriorityOrdered接口的后置处理器
    List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
    //存放实现了Ordered接口的BeanName
    List<String> orderedPostProcessorNames = new ArrayList<>();
    //存放没有实现了PriorityOrdered和Ordered接口的BeanName
    List<String> nonOrderedPostProcessorNames = new ArrayList<>();
    for (String ppName : postProcessorNames) {
      //跳过之前已经执行过的,也就是BeanDefinitionRegistryPostProcessor类型的后置处理器
      if (processedBeans.contains(ppName)) {
        // skip - already processed in first phase above
      }
      //实现PriorityOrdered,添加至集合中
      else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
        //getBean方法会从三级缓存获取,取不到会提交调用实例化初始化步骤
        priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
      }
      //实现Ordered,添加至集合中
      else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
        orderedPostProcessorNames.add(ppName);
      }
      //添加至集合中
      else {
        nonOrderedPostProcessorNames.add(ppName);
      }
    }
    // First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
    //排序并调用postProcessBeanFactory(beanFactory)方法
    sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
    invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
    // Next, invoke the BeanFactoryPostProcessors that implement Ordered.
    //遍历从bean工厂中获取实例对象,取不到进行实例化操作
    List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
    for (String postProcessorName : orderedPostProcessorNames) {
      orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
    }
    //排序并调用postProcessBeanFactory(beanFactory)方法
    sortPostProcessors(orderedPostProcessors, beanFactory);
    invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
    // Finally, invoke all other BeanFactoryPostProcessors.
    遍历从bean工厂中获取实例对象,取不到进行实例化操作
    List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
    for (String postProcessorName : nonOrderedPostProcessorNames) {
      nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
    }
    //排序并调用postProcessBeanFactory(beanFactory)方法
    invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
    // Clear cached merged bean definitions since the post-processors might have
    // modified the original metadata, e.g. replacing placeholders in values...
    beanFactory.clearMetadataCache();
  }

sortPostProcessors(),见方法6详解’

方法6:sortPostProcessors

private static void sortPostProcessors(List<?> postProcessors, ConfigurableListableBeanFactory beanFactory) {
    Comparator<Object> comparatorToUse = null;
    if (beanFactory instanceof DefaultListableBeanFactory) {
      comparatorToUse = ((DefaultListableBeanFactory) beanFactory).getDependencyComparator();
    }
    if (comparatorToUse == null) {
      comparatorToUse = OrderComparator.INSTANCE;
    }
    postProcessors.sort(comparatorToUse);
  }

这里我们的比较器为AnnotationAwareOrderComparator,在前面文章中的方法19有设置该比较器。

比较器部分代码如下:

  private int doCompare(Object o1, Object o2, OrderSourceProvider sourceProvider) {
    // 判断o1是否实现了PriorityOrdered接口
    boolean p1 = (o1 instanceof PriorityOrdered);
    // 判断o2是否实现了PriorityOrdered接口
    boolean p2 = (o2 instanceof PriorityOrdered);
    // 1.如果o1实现了PriorityOrdered接口, 而o2没有, 则o1排前面
    if (p1 && !p2) {
      return -1;
    }
    // 2.如果o2实现了PriorityOrdered接口, 而o1没有, 则o2排前面
    else if (p2 && !p1) {
      return 1;
    }
    // 3.如果o1和o2都实现(都没实现)PriorityOrdered接口
    // Direct evaluation instead of Integer.compareTo to avoid unnecessary object creation.
    // 拿到o1的order值, 如果没实现Ordered接口, 值为Ordered.LOWEST_PRECEDENCE
    int i1 = getOrder(o1, sourceProvider);
    // 拿到o2的order值, 如果没实现Ordered接口, 值为Ordered.LOWEST_PRECEDENCE
    int i2 = getOrder(o2, sourceProvider);
    // 4.通过order值(order值越小, 优先级越高)排序
    return (i1 < i2) ? -1 : (i1 > i2) ? 1 : 0;
  }

比较器的逻辑很简单,实现 PriorityOrdered 接口的优先级最高,如果两个对象都实现(都没实现)PriorityOrdered 接口,则根据 order 值(实现 Ordered 接口时,需要实现 getOrder() 方法,返回 order 值)来进行比较,order 值越小,优先级越高。

总结

本篇文章讲解了refresh方法中的prepareBeanFactory、postProcessBeanFactory、invokeBeanFactoryPostProcessors这三个方法。prepareBeanFactory其实就是BeanFactory工厂做一些准备工作,忽略某些值不被其它类所注入,以及添加一些后置处理器等。postProcessBeanFactory方法为拓展接口,提供子类进行拓展实现,我们也讲解了案例,通过编写实现ClassPathXmlApplicationContext子类重写该方法,并往该方法中添加后置处理器。invokeBeanFactoryPostProcessors方法主要是执行后置处理,主要分为两种类型的BeanFactoryPostProcessor,实现接口BeanDefinitionRegistryPostProcessor的和直接实现BeanFactoryPostProcessor接口的,BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的接口实现类。


梳理一下invokeBeanFactoryPostProcessors方法:

1.整个 invokeBeanFactoryPostProcessors 方法围绕两个接口,BeanDefinitionRegistryPostProcessor 和 BeanFactoryPostProcessor,其中 BeanDefinitionRegistryPostProcessor 继承了 BeanFactoryPostProcessor 。BeanDefinitionRegistryPostProcessor 主要用来在常规 BeanFactoryPostProcessor 检测开始之前注册其他 Bean 定义,说的简单点,就是 BeanDefinitionRegistryPostProcessor 具有更高的优先级,执行顺序在 BeanFactoryPostProcessor 之前。


2.整个 invokeBeanFactoryPostProcessors 方法操作了 3 种 bean 对象:

入参beanFactoryPostProcessors集合:

这个我们在方法4中有讲解过,主要取的是当前上下文对象,我们可以通过自定义上下文,并往该集合中添加后置处理器。


BeanDefinitionRegistryPostProcessor 接口实现类:

实现了 BeanDefinitionRegistryPostProcessor 接口,并且注册到 Spring IoC容器中。


常规 BeanFactoryPostProcessor 接口实现类:

实现了 BeanFactoryPostProcessor 接口,并且注册到 Spring IoC容器中。


3.该方法中的排序还引用了两个重要的接口PriorityOrdered 和 Ordered,其中 PriorityOrdered 继承了 Ordered,并且 PriorityOrdered 的优先级要高于 Ordered。实现 Ordered 接口需要重写 getOrder 方法,返回一个用于排序的 order 值,order 值的范围为 Integer.MIN_VALUE ~ Integer.MAX_VALUE,order 值越小优先级越高,Integer.MIN_VALUE 拥有最高优先级,而 Integer.MAX_VALUE 则对应的拥有最低优先级。


4.BeanFactoryPostProcessor中的优先级执行顺序如下:


第一优先级:上下文beanFactoryPostProcessors集合中的 BeanDefinitionRegistryPostProcessor,会先调用其 postProcessBeanDefinitionRegistry 方法。

第二优先级:beanFactory工厂中的bean,也就是我们配置文件或者注解所配置的Bean,实现了BeanDefinitionRegistryPostProcessor 、 PriorityOrdered 接口,会调用 postProcessBeanDefinitionRegistry 方法。

第三优先级:beanFactory工厂中的bean,实现BeanDefinitionRegistryPostProcessor 、Ordered 接口,会调用 postProcessBeanDefinitionRegistry 方法。

第四优先级:没有实现PriorityOrdered 或Ordered 接口的 BeanDefinitionRegistryPostProcessor 接口实现类,调用 postProcessBeanDefinitionRegistry 方法。

第五优先级:所有 BeanDefinitionRegistryPostProcessor 接口实现类,调用 postProcessBeanFactory 方法。

第六优先级:入参 beanFactoryPostProcessors 集合中的常规 BeanFactoryPostProcessor,调用 postProcessBeanFactory 方法。

第七优先级:beanFactory工厂中的bean,常规 BeanFactoryPostProcessor 接口实现类,并且实现了 PriorityOrdered 接口,调用 postProcessBeanFactory 方法。

第八优先级:beanFactory工厂中的bean,常规 BeanFactoryPostProcessor 接口实现类,并且实现了 Ordered 接口,调用 postProcessBeanFactory 方法。

第九优先级:没有实现PriorityOrdered 或Ordered 接口的 BeanFactoryPostProcessor 接口实现类,调用 postProcessBeanFactory 方法。


目录
相关文章
|
3天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
15 2
|
19天前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
|
9天前
|
前端开发 Java 开发者
Spring生态学习路径与源码深度探讨
【11月更文挑战第13天】Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学习路径入手,详细探讨如何系统地学习Spring,并深入解析各个重点的底层实现逻辑。
35 9
|
18天前
|
XML 缓存 Java
搞透 IOC、Spring IOC ,看这篇就够了!
本文详细解析了Spring框架的核心内容——IOC(控制反转)及其依赖注入(DI)的实现原理,帮助读者理解如何通过IOC实现组件解耦,提高程序的灵活性和可维护性。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
9天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
22 0
|
1月前
|
Java Spring
Spring底层架构源码解析(三)
Spring底层架构源码解析(三)
108 5
|
1月前
|
XML Java 数据格式
Spring底层架构源码解析(二)
Spring底层架构源码解析(二)
|
30天前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
65 0
|
2月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
1月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
162 2