springboot源码(三)创建上下文

280 阅读3分钟

image.png

1 创建上下文

context = createApplicationContext();

这里创建了spring对于不同web环境创房间的上下文

ApplicationContextFactory DEFAULT = (webApplicationType) -> {
   try {
      switch (webApplicationType) {
      case SERVLET:
         // mvc默认创建上下文
         return new AnnotationConfigServletWebServerApplicationContext();
      case REACTIVE:
         return new AnnotationConfigReactiveWebServerApplicationContext();
      default:
         return new AnnotationConfigApplicationContext();
      }
   }
   catch (Exception ex) {}
};

AnnotationConfigServletWebServerApplicationContext架构图如下 image-20220420135405987.png AnnotationConfigServletWebServerApplicationContext会初始化AnnotatedBeanDefinitionReaderClassPathBeanDefinitionScanner

public AnnotationConfigServletWebServerApplicationContext() {
   // 1.1 带注释的Bean定义阅读器
   this.reader = new AnnotatedBeanDefinitionReader(this);
   // 1.2 类路径Bean定义扫描器
   this.scanner = new ClassPathBeanDefinitionScanner(this);
}

父类GenericApplicationContext ,创建了默认的DefaultListableBeanFactory

public GenericApplicationContext() {
   this.beanFactory = new DefaultListableBeanFactory();
}

父父类AbstractApplicationContext

public AbstractApplicationContext() {
    // 初始化资源解析器
   this.resourcePatternResolver = getResourcePatternResolver();
}
​
protected ResourcePatternResolver getResourcePatternResolver() {
    return new PathMatchingResourcePatternResolver(this);
}

主要还是分为两部分 1.1 带注释的Bean定义阅读器 1.2 类路径Bean定义扫描器

1.1 初始化AnnotatedBeanDefinitionReader

AnnotatedBeanDefinitionReader的构造器

public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) {
   Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
   Assert.notNull(environment, "Environment must not be null");
   this.registry = registry;
   this.conditionEvaluator = new ConditionEvaluator(registry, environment, null);
    // 加入一些基本的功能性质的beandeDefinition
   AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
}

代码很长,但是很简单,注入一些功能性且稍后流程必备的RootBeanDefinition

public static final String CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME="org.springframework.context.annotation.internalConfigurationAnnotationProcessor";
​
public static final String AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME="org.springframework.context.annotation.internalAutowiredAnnotationProcessor";
​
public static final String COMMON_ANNOTATION_PROCESSOR_BEAN_NAME="org.springframework.context.annotation.internalCommonAnnotationProcessor";
​
public static final String PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME ="org.springframework.context.annotation.internalPersistenceAnnotationProcessor";
​
private static final String PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor";
​
public static final String EVENT_LISTENER_PROCESSOR_BEAN_NAME="org.springframework.context.event.internalEventListenerProcessor";
​
public static final String EVENT_LISTENER_FACTORY_BEAN_NAME="org.springframework.context.event.internalEventListenerFactory";
​
public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(
      BeanDefinitionRegistry registry, @Nullable Object source) {
​
   DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);
   if (beanFactory != null) {
      if (!(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) {
         beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
      }
      if (!(beanFactory.getAutowireCandidateResolver() instanceof ContextAnnotationAutowireCandidateResolver)) {
         beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
      }
   }
​
   Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<>(8);
​
    // ConfigurationClassPostProcessor  用于解析@Component、@ComponentScans、@Bean等等
    // 用于提供spring的配置类的自动扫描等等
   if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {
      RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
      def.setSource(source);
      beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
   }
    // AutowiredAnnotationBeanPostProcessor spring提供注解的依赖注入 @Autowired、@Value
   if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
      RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);
      def.setSource(source);
      beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
   }
​
   // CommonAnnotationBeanPostProcessor java规范的依赖注入 @Resource
   if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {
      RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);
      def.setSource(source);
      beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));
   }
​
   // Check for JPA support, and if present add the PersistenceAnnotationBeanPostProcessor.
   if (jpaPresent && !registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)) {
      RootBeanDefinition def = new RootBeanDefinition();
      try {
         def.setBeanClass(ClassUtils.forName(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME,
               AnnotationConfigUtils.class.getClassLoader()));
      }
      catch (ClassNotFoundException ex) {
         throw new IllegalStateException(
               "Cannot load optional framework class: " + PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, ex);
      }
      def.setSource(source);
      beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME));
   }
​
   if (!registry.containsBeanDefinition(EVENT_LISTENER_PROCESSOR_BEAN_NAME)) {
      RootBeanDefinition def = new RootBeanDefinition(EventListenerMethodProcessor.class);
      def.setSource(source);
      beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME));
   }
​
   if (!registry.containsBeanDefinition(EVENT_LISTENER_FACTORY_BEAN_NAME)) {
      RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class);
      def.setSource(source);
      beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME));
   }
​
   return beanDefs;
}

1.2 初始化ClassPathBeanDefinitionScanner

public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters,
      Environment environment, @Nullable ResourceLoader resourceLoader) {
​
   Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
   this.registry = registry;
​
   if (useDefaultFilters) {
      registerDefaultFilters();
   }
    // 设置环境
   setEnvironment(environment);
    // 设置资源加载器 其实就是AnnotationConfigServletWebServerApplicationContext
   setResourceLoader(resourceLoader);
}
​
protected void registerDefaultFilters() {
    // 过滤器增加@Component
    this.includeFilters.add(new AnnotationTypeFilter(Component.class));
    ClassLoader cl = ClassPathScanningCandidateComponentProvider.class.getClassLoader();
    // 过滤器增加@ManagedBean注解
    try {
        this.includeFilters.add(new AnnotationTypeFilter(((Class<? extends Annotation>) ClassUtils.forName("javax.annotation.ManagedBean", cl)), false));}
    // 过滤器增加@Named注解
    try {
        this.includeFilters.add(new AnnotationTypeFilter(((Class<? extends Annotation>) ClassUtils.forName("javax.inject.Named", cl)), false));
        }
    }

最终注入了5个,分类如下

BeanFactoryPostProcessor:

ConfigurationClassPostProcessor 用于解析@Component@ComponentScans@Bean等等

BeanPostProcessor:

AutowiredAnnotationBeanPostProcessor spring提供注解的依赖注入 @Autowired@Value
CommonAnnotationBeanPostProcessor java规范的依赖注入 @Resource
EventListenerMethodProcessor

其他:

DefaultEventListenerFactory

@ManagedBean、@Named都是java提供的规范注解,spring在这里也做了支持,效果和@Component一样,而@Component的子注解也一样会被注册

2 刷新上下文

refreshContext(context);

private void refreshContext(ConfigurableApplicationContext context) {
   if (this.registerShutdownHook) {
      shutdownHook.registerApplicationContext(context);
   }
   refresh(context);
}
protected void refresh(ConfigurableApplicationContext applicationContext) {
    applicationContext.refresh();
}

refresh()方法最终还是调用的AbstractApplicationContext的实现

熟悉spring的都知道这里全是spring提供的一个默认的上下文

@Override
public void refresh() throws BeansException, IllegalStateException {
   synchronized (this.startupShutdownMonitor) {
       // 设置一下当前上下文状态
      StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");
​
      // 准备上下文
      prepareRefresh();
​
      // 设置了serializationId,并且返回创建好的beanFactory
      ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
​
      // 准备bean工厂
      // 忽略一些自动注入的bean,增加一些BeanPostProcessor
      prepareBeanFactory(beanFactory);
​
      try {
         // 空方法,由子类扩展实现
         // 这里AnnotationConfigServletWebServerApplicationContext又帮我们注册了一些BeanPostProcessor
         postProcessBeanFactory(beanFactory);
​
         // 设置当前上下文状态
         StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
         // Invoke factory processors registered as beans in the context.
         invokeBeanFactoryPostProcessors(beanFactory);
​
         // Register bean processors that intercept bean creation.
         registerBeanPostProcessors(beanFactory);
         beanPostProcess.end();
​
         // Initialize message source for this context.
         initMessageSource();
​
         // Initialize event multicaster for this context.
         initApplicationEventMulticaster();
​
         // Initialize other special beans in specific context subclasses.
         onRefresh();
​
         // Check for listener beans and register them.
         registerListeners();
​
         // Instantiate all remaining (non-lazy-init) singletons.
         finishBeanFactoryInitialization(beanFactory);
​
         // Last step: publish corresponding event.
         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();
         contextRefresh.end();
      }
   }
}

这个方法非常复杂,设计到spring大部分的核心流程,这里简单介绍一下调用BeanFactoryPostProcessor的基本流程

2.1 调用BeanFactoryPostProcessor

invokeBeanFactoryPostProcessors 这个方法会spring工厂的后置处理器这里涉及了两个重要的接口BeanDefinitionRegistryPostProcessorBeanFactoryPostProcessor

BeanDefinitionRegistryPostProcessor 用于提供更多的BeanDefinition

BeanFactoryPostProcessor 用于对beanFactory提供一次更改的机会

public static void invokeBeanFactoryPostProcessors(
      ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
​
   // Invoke BeanDefinitionRegistryPostProcessors first, if any.
   Set<String> processedBeans = new HashSet<>();
​
   // 如果beanFactory实现了BeanDefinitionRegistry
   // 有直接回调postProcessBeanFactory()方法
   if (beanFactory instanceof BeanDefinitionRegistry) {
      BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
      List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
      List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
      // 遍历默认提供的beanFactoryPostProcessors
      for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
         if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
            BeanDefinitionRegistryPostProcessor registryProcessor =
                  (BeanDefinitionRegistryPostProcessor) postProcessor;
            registryProcessor.postProcessBeanDefinitionRegistry(registry);
            registryProcessors.add(registryProcessor);
         }
         else {
            regularPostProcessors.add(postProcessor);
         }
      }
​
      // Do not initialize FactoryBeans here不要在这里实例化bean
      List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
​
      // First, 初始化继承PriorityOrdered的BeanDefinitionRegistryPostProcessor
      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);
      // ostProcessBeanDefinitionRegistry
      invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
      currentRegistryProcessors.clear();
​
      // Next,  初始化继承Ordered的BeanDefinitionRegistryPostProcessor.
      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);
      // 调用postProcessBeanDefinitionRegistry
      invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
      currentRegistryProcessors.clear();
​
      // Finally, 初始化所用BeanDefinitionRegistryPostProcessor知道不出现为止
      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, beanFactory.getApplicationStartup());
         currentRegistryProcessors.clear();
      }
​
      //  =始化BeanFactoryPostProcessor扫描BeanDefinitionRegistryPostProcessor出现的BeanFactoryPostProcessor
      invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
      //  初始化默认提供的BeanFactoryPostProcessor
      invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
   }
​
   else {
      // 直接调用postProcessBeanFactory
      invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
   }
​
   // Do not initialize FactoryBeans here
   // 从容器中获取BeanFactoryPostProcessor
   String[] postProcessorNames =
         beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
​
   // 分别对继承PriorityOrdered和Ordered和空继承的进行排序分组
   List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
   List<String> orderedPostProcessorNames = new ArrayList<>();
   List<String> 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, 调用继承PriorityOrdered的postProcessBeanFactory
   sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
   invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
​
   // Next, 调用继承Ordered的postProcessBeanFactory
   List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
   for (String postProcessorName : orderedPostProcessorNames) {
      orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
   }
   sortPostProcessors(orderedPostProcessors, beanFactory);
   invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
​
   // Finally, 调用剩下的postProcessBeanFactory
   List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
   for (String postProcessorName : nonOrderedPostProcessorNames) {
      nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
   }
   invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
​
   // 清理缓存
   beanFactory.clearMetadataCache();
}

对于invokeBeanDefinitionRegistryPostProcessors和invokeBeanFactoryPostProcessors方法都是回调对应的接口方法。

invokeBeanFactoryPostProcessors方法简单来说分为两部

1一直寻找BeanDefinition调用postProcessBeanDefinitionRegistry,但是从设计上来说spring的排序并不是完全意义上的排序,每次都会产生新的BeanDefinitionRegistryPostProcessor,spring只能保证按顺序调用新产生的BeanDefinitionRegistryPostProcessor。最后直接调用默认提供的postProcessBeanFactory

2 因为已经执行完postProcessBeanDefinitionRegistry此时已经没有可以产生新的BeanDefinition,直接排序BeanFactoryPostProcessor,按顺序调用postProcessBeanFactory

上文提到springboot为我们默认提供了一个BeanFactoryPostProcessor:ConfigurationClassPostProcessor

image.png

这个类也真是spring自动化装配的关键,这里提供了其架构图,下文会详细介绍ConfigurationClassPostProcessor是如何对解析@Component、@ComponentScans、@Bean等注解的流程