SPRING源码5.0:容器的功能扩展BeanFactoryPostProcessor

BeanFactory的后处理

BeanFactory作为Spring中容器功能的基础,用于存放所有已经加载的bean,为了保证程序上的高可扩展性,SPring针对BeanFactory做了大量的扩展,如PostProcessor等就是在在此实现的。

激活注册的BeanFactoryPostProcessor

BeanFactoryPostProcessor接口同BeanPostProcessor类型,可对bean的定义(配置元数据)进行处理,也就是说。

  • SpringIoc 容器允许BeanFactoryPostProcessor在容器实际实例化任何其他的bean之前读取配置元数据,并有可能修改它。
  • 你可以配置多个BeanFactoryPostProcessor,也可以通过设置“order"属性来控制BeanFactoryPostProcessor的执行次序,仅当实现了Ordered接口才可以设置。
  • 如果想改变实际的bean实例(列如从配置元数据创建的对象),那么最好使用BeanPostProcessor
  • BeanFactoryPostProcessor的作用域范围是容器级的。它只和你使使用的容器有关。
  • 它只会对你定义的此容器进行后置处理,另一个不会,即使这两个容器在统一层次上

BeanFactoryPostProcessor的典型应用,如PropertyPlacholderConfigurer

使用了国际化



${bean.message}


${bean.message}的配置在bean.property中设置值
Spring框架靠PropertyPlaceHolderConfigurer类来找到这个properties配置



config/bean.properties


ProperrtyPlaceHolderConfigurer这个类间接继承了BeanFactoryPostProcessor接口。
当Spring加载任何实现了这个接口的bean的配置时,都会在bean工厂载入所有bean的配置后执行postProcessBeanFactory方法。在PropertyResourceConfigurer类中实现了postProcessBeanFactory方法。此方法先后调用了mergeProperties,convertProperties,processProperly这三个方法分别得到配置,将得到的配置转换为合适类型,最后将配置内容告知BeanFactory。
BeanFactoryPostProcessor接口,BeanFactory会在实例化任何bean之前获得配置信息,从一能够正确解析bean描述文件中的变量引用。

使用自定义BeanFactoryPostProcessor

具体使用网上可查询

通过implements BeanFactoryPostProcessor实现postProcessBeanFactory
引用的时候

configurableListableBeanFactory bf = new XmlBeanFactory(new ClassPathResource("/META-INF/BeanFactory.xml"));
BeanFactoryPostProcessor bfpp=(BeanFactoryPostProcessor)bf.getBean("bfpp");
bfpp.postProcessBeanFactory(bf);//通过实现此方法
//使用

激活BeanFactoryPostProcessor

我们看一下BeanFactoryPostProcessor的调用过程

protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
//主逻辑在invokeBeanFactoryProcessors  
 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()));
   }
}

public static void invokeBeanFactoryPostProcessors(
      ConfigurableListableBeanFactory beanFactory, List beanFactoryPostProcessors) {

   // Invoke BeanDefinitionRegistryPostProcessors first, if any.
   Set processedBeans = new HashSet<>();
//对BeanDefinitionRegistery类型的处理
   if (beanFactory instanceof BeanDefinitionRegistry) {
      BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
      List regularPostProcessors = new ArrayList<>();
      List registryProcessors = new ArrayList<>();

//硬编码注册的后处理
      for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
         if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
            BeanDefinitionRegistryPostProcessor registryProcessor =
                  (BeanDefinitionRegistryPostProcessor) postProcessor;
            //对于BeanDefinitionRegistryPostProcessor类型,在BeanFactoryPostProcessor的基础上还要自己定义的方法,需要先调用
     registryProcessor.postProcessBeanDefinitionRegistry(registry);
            registryProcessors.add(registryProcessor);
         }
         else {
//记录常规BeanFactoryPostProcessor
            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 currentRegistryProcessors = new ArrayList<>();

      // First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
      String[] postProcessorNames =
            beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
      for (String ppName : postProcessorNames) {
         if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
            currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
            processedBeans.add(ppName);
         }
      }
      sortPostProcessors(currentRegistryProcessors, beanFactory);
      registryProcessors.addAll(currentRegistryProcessors);
   //激活postProcessorBeanFactory方法,之前激活的时postProcessBeanDefinitionRegistry
//硬编码设置的BeanDefinitionRegistryPostProcessor 
     invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
      currentRegistryProcessors.clear();

      // Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
      postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
      for (String ppName : postProcessorNames) {
         if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
            currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
            processedBeans.add(ppName);
         }
      }
      sortPostProcessors(currentRegistryProcessors, beanFactory);
      registryProcessors.addAll(currentRegistryProcessors);
      invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
      currentRegistryProcessors.clear();

      // Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
      boolean reiterate = true;
      while (reiterate) {
         reiterate = false;
         postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
         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();
      }

      // Now, invoke the postProcessBeanFactory callback of all processors handled so far.
      invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
      invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
   }

   else {
      // Invoke factory processors registered with the context instance.
      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.
   List priorityOrderedPostProcessors = new ArrayList<>();
   List orderedPostProcessorNames = new ArrayList<>();
   List nonOrderedPostProcessorNames = new ArrayList<>();
//对后处理进行分类    
for (String ppName : postProcessorNames) {
      if (processedBeans.contains(ppName)) {
         // skip - already processed in first phase above
      }
      else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
         priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
      }
//设置优先级
      else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
         orderedPostProcessorNames.add(ppName);
      }
      else {
         nonOrderedPostProcessorNames.add(ppName);
      }
   }

   // First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
   sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
   invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);

   // Next, invoke the BeanFactoryPostProcessors that implement Ordered.
   List orderedPostProcessors = new ArrayList<>();
   for (String postProcessorName : orderedPostProcessorNames) {
      orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
   }
   sortPostProcessors(orderedPostProcessors, beanFactory);
   invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);

//无序,直接调用
   // Finally, invoke all other BeanFactoryPostProcessors.
   List nonOrderedPostProcessors = new ArrayList<>();
   for (String postProcessorName : nonOrderedPostProcessorNames) {
      nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
   }
   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();
}

对BeanFactoryPostProcessor的处理主要分两种情况进行

  • 对于BeanDefinitionRegistry类的特殊处理
  • 对普通BeanFactoryPostProcessor机械能处理

每种都需要考虑到硬编码注入的后处理器以及通过配置注入的后处理器。

BeanDefinitionRegistry类型的处理类的处理包括

  • 对于硬编码注册的后处理器结果,主要时通过AbstractApplicationContext中的添加处理器方法addBeanFactoryPostProcessor进行添加
public void addBeanFactoryPostProcessor(BeanFactoryPostProcessor beanFactoryPostProcessor){
this.beanFactoryPostProcessors.add(beanFactoryPostProcessor);
}
  • 添加后的后处理器会存放在beanFactoryPostProcessors中,而在处理BeanFactoryPostProcessor时会首先检测beanFactoryPostProcessors是否有数据。
  • BeanDefinitionRegistryPostProcessor继承自BeanFactoryPostProcessor,不但有BeanFactoryPostProcessor的特性,同时还有自定义的个性方法。也需要在此调用。
  • 所有这里需要从beanFactoryPostProcessors中跳出BeanDefinitionRegistryPostProcessor的后处理器,并进行其postProcessBeanDefintionRegistry方法的激活。

记录后处理器主要使用了3个List完成

  • registryPostProcessors:记录通过硬编码方法注册的BeanDefinitionRegistryPostProcessors类型的处理器
  • regularPostProcessors:记录通过硬编码方式注册的BeanFactoryPostProcessors类型的处理器
  • registryPostProcessorBeans:记录哦通过配置放注册的BeanDefinitionRegistryPostProcessors类型的处理器

对以上记录的List中的后处理器进行统一调用BeanFactoryPostProcessor的

PostProcessorsBeanFactory方法

对beanFactoryPostProcessors中非BeanDefinitionRegistryPostProcessor类型的后处理器进行

统一的BeanFactoryPostProcessor的postProcessFactory方法调用

普通beanFactory处理

BeanDefinitionRegistryPostProcessor只对BeanDefinitiionRegistry类型的ConfigurableListableBeanFactory有效。所以如果判断所示的beanFactory并不是BeanDefinitionRegistry,那么便可以忽略BeanDefinitionRegistryPostProcessor,而直接处理BeanFactoryPostProcessor,当然获取的方式与上面的获取类型
对于硬编码方式手动台南佳的后处理器时不需要做任何排序的,但是在配置文件中读取的处理器,Spring并不保证读取的顺序,所以需要按照PriorityOrdered或者Ordered的顺序调用

注册BeanPostProcessor

上文提到了BeanFactoryPostProcessors的调用,现在看下BeanPostProcessor。但是这里不是调用,而是注册。
真正的调用是在bean的实例化阶段进行的,Spring中大部分功能都是通过后处理的方式进行扩展的。这是Spring框架的一个特性,但是在BeanFactory中其实并没有实现后处理的自动注册。所以在调用的时候如果没有进行手动注册其实是不能使用的。但是ApplicationContext中却添加了自动注册功能。
如,定义一个后处理器

public class MyInsatantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor{
public Object postProcessBeforeInitialization(Object bean,String beanNamee) throws BeansException{
System.out.println("==");
return null;
}
...
}

在配置文件中添加


那么使用BeanFactory方式进行Spring的bean的加载时是不会有任何变化的,但是如果使用ApplicationContext方法获取bean的时候就会在获取每个bean时打印 ===,而这个体现就是在registerBeanPostProcessors方法中完成。

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

   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.
   List priorityOrderedPostProcessors = new ArrayList<>();
   List internalPostProcessors = new ArrayList<>();
//Orered保证顺序,上面是PriorityOrdered
   List orderedPostProcessorNames = new ArrayList<>();
   List nonOrderedPostProcessorNames = new ArrayList<>();
   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);
      }
   }

//注册所有实现PriorityOrdered的BeanPostProcessor
   // First, register the BeanPostProcessors that implement PriorityOrdered.
   sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
   registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

//注册所有实现Ordered的BeanPostProcessor
   // Next, register the BeanPostProcessors that implement Ordered.
   List 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);

//注册所有无序的BeanPostProcessor
   // Now, register all regular BeanPostProcessors.
   List 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);

//
//注册所有实现MergedBeanDefinitionPostProcessor类型的BeanPostProcessor,并非重复注册
//在beanFactory.addBeanPostProcessor中会异常已经存在的BeanPostProcessor  
 // Finally, re-register all internal BeanPostProcessors.
   sortPostProcessors(internalPostProcessors, beanFactory);
   registerBeanPostProcessors(beanFactory, internalPostProcessors);

//添加ApplicationListener探测器
   // Re-register post-processor for detecting inner beans as ApplicationListeners,
   // moving it to the end of the processor chain (for picking up proxies etc).
   beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}

对于BeanPostProcessor的处理与BeanFactoryPostProcessor的处理极为相似。不同:

  • 对于BeanFactoryPostProcessor的处理分两种,一是通过硬编码方式的处理,另一种是通过配置文件的处理
  • BeanPostProcessor的处理只考虑了配置文件的方式而不考虑硬编码的反射
  • BeanFactoryPostProcessor的处理们不但要实现注册功能,而且还有对后处理器进的激活操作,所以在载入配置中的定义,并进行激活
  • BeanPostProcessor并不需要马上调用,硬编码实现的功能是将后处理器提取并调用。这里不需要调用,这里只需要将配置文件的BeanPostProcessor提取处理并注册进入beanFactory就可以了

Spring中支持对于BeanPostProcessor的排序,如根据PriorityOrdered进行排序,根据Ordered进行排序or无序。而Spring在BeanPostProcessor的激活顺序的时候也会考虑对于顺序的问题而进行排序。
internalPostProcessors中存储的后处理器也就是MergedBeanDefinitionPostProcessor类型的处理器重复调用了。是去确保beanPostProcessor的唯一性。在registerBeanProcessors中保存分类使用了add和remove

invokeBeanFactoryPostProcessors 中

for (String ppName : postProcessorNames) {
   if (processedBeans.contains(ppName)) {
      // skip - already processed in first phase above
   }
   else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
      priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
   }
   else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
      orderedPostProcessorNames.add(ppName);
   }
   else {
      nonOrderedPostProcessorNames.add(ppName);
   }
}
private static void registerBeanPostProcessors(
      ConfigurableListableBeanFactory beanFactory, List postProcessors) {

   for (BeanPostProcessor postProcessor : postProcessors) {
      beanFactory.addBeanPostProcessor(postProcessor);
   }
}

初始化消息资源

国际化

Spring定义了访问国际化信息的MessageSource接口,并提供了国际化信息的MessageSource接口。并提供了几个医用的实现类MessageSource分别对HierarchicalMessageSource和ApplicationContext接口扩展

  • HierarchicalMessageSource接口最重要的两个实现类是ResourceBundleMessageSource和ReloadableResourceBundleMessageSource,他们是基于Java的ResourceBundle基础类实现,允许仅通过资源名加载国际化资源。
  • ReloadableResourceBundleMessageSource提供了定时刷新功能,允许在不重启系统情况更新资源的信息。
  • StaticMessageSource主要用于程序测试,它预先通过编程的方式提供国际化信息。而DelegatingMessageSource是为方便父MessageSource而提供的代理类。

在initMessageSource中获取自定义资源文件的方式为beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME.MessageSource.class),这里Spring使用了硬编码的方式硬性规定了定义资源文件必须为message,否则会获取不到自定义资源配置。

protected void initMessageSource() {
   ConfigurableListableBeanFactory beanFactory = getBeanFactory();
   if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
      this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
      // Make MessageSource aware of parent MessageSource.
      if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
         HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
         if (hms.getParentMessageSource() == null) {
            // Only set parent context as parent MessageSource if no parent MessageSource
            // registered already.
            hms.setParentMessageSource(getInternalParentMessageSource());
         }
      }
      if (logger.isDebugEnabled()) {
         logger.debug("Using MessageSource [" + this.messageSource + "]");
      }
   }
   else {
      // Use empty MessageSource to be able to accept getMessage calls.
      DelegatingMessageSource dms = new DelegatingMessageSource();
      dms.setParentMessageSource(getInternalParentMessageSource());
      this.messageSource = dms;
      beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
      if (logger.isDebugEnabled()) {
         logger.debug("Unable to locate MessageSource with name '" + MESSAGE_SOURCE_BEAN_NAME +
               "': using default [" + this.messageSource + "]");
      }
   }
}

初始化ApplicationEventMulticaster

Spring的事件传播器。
Spring的事件监听用法具体可以网上查询。一种基于设计模式的观察者模式

initApplicationEventMulticaster的方式比较简单。

  • 如果用户自定义了事件广播器,那么使用用户自定义的事件广播器
  • 如果用户没有自定义事件广播器,那么使用默认的ApplicationEventMulticaster

protected void initApplicationEventMulticaster() {
   ConfigurableListableBeanFactory beanFactory = getBeanFactory();
   if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
      this.applicationEventMulticaster =
            beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
      if (logger.isDebugEnabled()) {
         logger.debug("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
      }
   }
   else {
      this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
      beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
      if (logger.isDebugEnabled()) {
         logger.debug("Unable to locate ApplicationEventMulticaster with name '" +
               APPLICATION_EVENT_MULTICASTER_BEAN_NAME +
               "': using default [" + this.applicationEventMulticaster + "]");
      }
   }
}

按照逻辑,作为广播器,一定是用于存放监听器并在合适的时候调用监听器。
默认的广播器实现SimplApplicationEventMulticaster

@Override
public void multicastEvent(final ApplicationEvent event, @Nullable ResolvableType eventType) {
   ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event));
   for (final ApplicationListener listener : getApplicationListeners(event, type)) {
      Executor executor = getTaskExecutor();
      if (executor != null) {
         executor.execute(() -> invokeListener(listener, event));
      }
      else {
         invokeListener(listener, event);
      }
   }
}

当产生Spring事件时候会默认使用SimpleApplicationEventMulticaster的multicastEvent来广播事件,遍历所有的监听器,并使用监听器中的方法进行监听器的处理。而对于每个监听器来说其实都可以获取到对应的事件,但是是否进行处理则由事件监听器来决定。

注册监听器

protected void registerListeners() {
   // Register statically specified listeners first.
   for (ApplicationListener listener : getApplicationListeners()) {
      getApplicationEventMulticaster().addApplicationListener(listener);
   }

   // Do not initialize FactoryBeans here: We need to leave all regular beans
   // uninitialized to let post-processors apply to them!
   String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
   for (String listenerBeanName : listenerBeanNames) {
      getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
   }

   // Publish early application events now that we finally have a multicaster...
   Set earlyEventsToProcess = this.earlyApplicationEvents;
   this.earlyApplicationEvents = null;
   if (earlyEventsToProcess != null) {
      for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
         getApplicationEventMulticaster().multicastEvent(earlyEvent);
      }
   }
}

初始化非延迟加载单例

完成BeanFactory的初始化工作,其中包括ConversionService的设置,配置冻结以及非延迟加载的bean初始化工作。

protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
   // Initialize conversion service for this context.
   if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
         beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
      beanFactory.setConversionService(
            beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
   }

   // Register a default embedded value resolver if no bean post-processor
   // (such as a PropertyPlaceholderConfigurer bean) registered any before:
   // at this point, primarily for resolution in annotation attribute values.
   if (!beanFactory.hasEmbeddedValueResolver()) {
      beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
   }

   // Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.
   String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
   for (String weaverAwareName : weaverAwareNames) {
      getBean(weaverAwareName);
   }

   // Stop using the temporary ClassLoader for type matching.
   beanFactory.setTempClassLoader(null);

//冻结所有的bean定义,说明注册的bean定义将不被修改或任何一步的处理。
   // Allow for caching all bean definition metadata, not expecting further changes.
   beanFactory.freezeConfiguration();

//初始化剩下但实例(非惰性)
   // Instantiate all remaining (non-lazy-init) singletons.
   beanFactory.preInstantiateSingletons();
}

分析代码

ConverisionService设置

上一章有自定义类转换器String转换为Date的方式。
在Spring中也提供了另一种方式Converter。具体使用可以网上查询。

冻结所有bean的定义。说明注册的bean定义将不被修改or进行任何进一步的处理

接口ConfigurableListableBeanFactory
具体实现是在DefaultListableBeanFactory

@Override
public void freezeConfiguration() {
   this.configurationFrozen = true;
   this.frozenBeanDefinitionNames = StringUtils.toStringArray(this.beanDefinitionNames);
}

初始化非延迟加载

  • ApplicationContext实现的默认行为就是在启动时,将所有单例bean提取进行实例化。
  • 提前实例化意味着作为初始化过程中的一部分,ApplicationContext实例会创建并配置所有的单例bean
  • 在配置中的任何错误就会即刻被发现,这个实例化过程就是在finishBeanFactoryInitializatoin中完成的。

@Override
public void preInstantiateSingletons() throws BeansException {
   if (logger.isDebugEnabled()) {
      logger.debug("Pre-instantiating singletons in " + this);
   }

   // Iterate over a copy to allow for init methods which in turn register new bean definitions.
   // While this may not be part of the regular factory bootstrap, it does otherwise work fine.
   List beanNames = new ArrayList<>(this.beanDefinitionNames);

   // Trigger initialization of all non-lazy singleton beans...
   for (String beanName : beanNames) {
      RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
      if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
         if (isFactoryBean(beanName)) {
            Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
            if (bean instanceof FactoryBean) {
               final FactoryBean factory = (FactoryBean) bean;
               boolean isEagerInit;
               if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
                  isEagerInit = AccessController.doPrivileged((PrivilegedAction)
                              ((SmartFactoryBean) factory)::isEagerInit,
                        getAccessControlContext());
               }
               else {
                  isEagerInit = (factory instanceof SmartFactoryBean &&
                        ((SmartFactoryBean) factory).isEagerInit());
               }
               if (isEagerInit) {
                  getBean(beanName);
               }
            }
         }
         else {
            getBean(beanName);
         }
      }
   }

   // Trigger post-initialization callback for all applicable beans...
   for (String beanName : beanNames) {
      Object singletonInstance = getSingleton(beanName);
      if (singletonInstance instanceof SmartInitializingSingleton) {
         final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
         if (System.getSecurityManager() != null) {
            AccessController.doPrivileged((PrivilegedAction) () -> {
               smartSingleton.afterSingletonsInstantiated();
               return null;
            }, getAccessControlContext());
         }
         else {
            smartSingleton.afterSingletonsInstantiated();
         }
      }
   }
}

 
  

finishRefresh

在Spring中提供了Lifecycle接口,其接口包含start/stop方法,实现此接口后Spring会保证在启动的时候调用start方法开始生命周期。
并在关闭的时候调用stop方法来结束生命周期,通常用来配置后台程序,在启动后一直运行(如对MQ进行轮询),而ApplicationContext的初始化最后正是保证了这一个功能的实现。

protected void finishRefresh() {
   // Clear context-level resource caches (such as ASM metadata from scanning).
   clearResourceCaches();

   // Initialize lifecycle processor for this context.
   initLifecycleProcessor();

   // Propagate refresh to lifecycle processor first.
   getLifecycleProcessor().onRefresh();

   // Publish the final event.
   publishEvent(new ContextRefreshedEvent(this));

   // Participate in LiveBeansView MBean, if active.
   LiveBeansView.registerApplicationContext(this);
}
  • initLifecycleProcessor

当ApplicationContext启动or停止时,他会通过LifecycleProcessor来与所有声明的bean的周期做状态更新,而在LifecycleProcessor使用前首先需要初始化。

protected void initLifecycleProcessor() {
   ConfigurableListableBeanFactory beanFactory = getBeanFactory();
   if (beanFactory.containsLocalBean(LIFECYCLE_PROCESSOR_BEAN_NAME)) {
      this.lifecycleProcessor =
            beanFactory.getBean(LIFECYCLE_PROCESSOR_BEAN_NAME, LifecycleProcessor.class);
      if (logger.isDebugEnabled()) {
         logger.debug("Using LifecycleProcessor [" + this.lifecycleProcessor + "]");
      }
   }
   else {
      DefaultLifecycleProcessor defaultProcessor = new DefaultLifecycleProcessor();
      defaultProcessor.setBeanFactory(beanFactory);
      this.lifecycleProcessor = defaultProcessor;
      beanFactory.registerSingleton(LIFECYCLE_PROCESSOR_BEAN_NAME, this.lifecycleProcessor);
      if (logger.isDebugEnabled()) {
         logger.debug("Unable to locate LifecycleProcessor with name '" +
               LIFECYCLE_PROCESSOR_BEAN_NAME +
               "': using default [" + this.lifecycleProcessor + "]");
      }
   }
}
  • onRefresh

启动了所有实现了Lifecycle接口的bean

@Override
public void onRefresh() {
   startBeans(true);
   this.running = true;
}

private void startBeans(boolean autoStartupOnly) {
   Map lifecycleBeans = getLifecycleBeans();
   Map phases = new HashMap<>();
   lifecycleBeans.forEach((beanName, bean) -> {
      if (!autoStartupOnly || (bean instanceof SmartLifecycle && ((SmartLifecycle) bean).isAutoStartup())) {
         int phase = getPhase(bean);
         LifecycleGroup group = phases.get(phase);
         if (group == null) {
            group = new LifecycleGroup(phase, this.timeoutPerShutdownPhase, lifecycleBeans, autoStartupOnly);
            phases.put(phase, group);
         }
         group.add(beanName, bean);
      }
   });
   if (!phases.isEmpty()) {
      List keys = new ArrayList<>(phases.keySet());
      Collections.sort(keys);
      for (Integer key : keys) {
         phases.get(key).start();
      }
   }
}

  • publishEvent

当完成ApplicationContext初始化的时候,要通过Spring中的事件发布机制发错ContextRefreshedEvent事件,以保证对应的监听器可以做一步的逻辑处理

@Override
public void publishEvent(ApplicationEvent event) {
   publishEvent(event, null);
}
protected void publishEvent(Object event, @Nullable ResolvableType eventType) {
   Assert.notNull(event, "Event must not be null");
   if (logger.isTraceEnabled()) {
      logger.trace("Publishing event in " + getDisplayName() + ": " + event);
   }

   // Decorate event as an ApplicationEvent if necessary
   ApplicationEvent applicationEvent;
   if (event instanceof ApplicationEvent) {
      applicationEvent = (ApplicationEvent) event;
   }
   else {
      applicationEvent = new PayloadApplicationEvent<>(this, event);
      if (eventType == null) {
         eventType = ((PayloadApplicationEvent) applicationEvent).getResolvableType();
      }
   }

   // Multicast right now if possible - or lazily once the multicaster is initialized
   if (this.earlyApplicationEvents != null) {
      this.earlyApplicationEvents.add(applicationEvent);
   }
   else {
      getApplicationEventMulticaster().multicastEvent(applicationEvent, eventType);
   }

   // Publish event via parent context as well...
   if (this.parent != null) {
      if (this.parent instanceof AbstractApplicationContext) {
         ((AbstractApplicationContext) this.parent).publishEvent(event, eventType);
      }
      else {
         this.parent.publishEvent(event);
      }
   }
}

小结

  • 开始使用ApplicationContext的ClassPathXmlApplicationContext---------------ClassPathXmlApplicationContext->setConfigLocations获取路径----->refresh—>里面的层次功能

  • 以下是对refresh

  • prepareRefresh-----可扩展initPropertySources,getEnvireonment().validateRequiredProperties

  • obtainFreshBeanFactory-----加载beanFactory,实现beanFactory—> 父类AbstractRefreshableApplicationContext—>refreshBeanFactory-----实例化DefaultListableBeanFactory-----customizeBeanFactory,loadBeanDefinitions,定制bean和加载BeanDefintioin---------> loadBeanDefinitions-----初始化XmlBeanDefinitiionReader------->加载BeanDefintiion—>loadBeanDefinition

  • prepareBeanFactoy—ApplicationContext的功能上的扩展在此展开---->SpEL语言支持—>增加属性编辑器------>添加ApplicationContextAwareProcessor处理器----实现Aware接口的bean初始化后取得对应的资源----->设置忽略依赖–对Aware忽略依赖注入---->注册依赖

  • BeanPostProcessor --激活BeanPostProcessor---->invokeBeanFactoryPostProcessors(具体实现是在PostProcessorRegistrationDelegate中)-----这里区别以下对于BeanFactory和Bean的PostProcessor------注册BeanPostProcessor----->registerBeanPostProcessors

  • 国际化—initMessageSource

  • 监听------initApplicationEventMulticster—> SimpleApplicationEventMulticaster的multicastEvent----->注册 registerListeners

  • 初始化非延迟加载单例—包括了ConversionService转换器。冻结配置 freezeConfiguration。初始化非延迟加载 preInstantiateSingletons

  • finishRefresh—通知刷新功能,启动lifecycle,发出ContextRefreshEvent通知别人—>finishRefresh---->initLifecycleProcessor—>onRefresh----->publishEvent

你可能感兴趣的:(Spring)