Spring Bean 的创建流程

374 阅读1分钟

这里讨论的版本是spring framework 5.3.X 的版本,如果逻辑有出入,先确定我们讨论的版本是不是一致

在 ApplicationContext中,IOC容器的启动通过org.springframework.context.support.AbstractApplicationContext#refresh 方法实现。而这其中bean的创建是通过 refresh中的 finishBeanFactoryInitialization

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 BeanFactoryPostProcessor
   // (such as a PropertySourcesPlaceholderConfigurer 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);

   // Allow for caching all bean definition metadata, not expecting further changes.
   beanFactory.freezeConfiguration();

   // Instantiate all remaining (non-lazy-init) singletons.
   // 执行bean 的创建
   beanFactory.preInstantiateSingletons();
}

在ApplicationContext中BeanFactory 的实现即 DefaultListableBeanFactory。所以代码来到 org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons

public void preInstantiateSingletons() throws BeansException {
   if (logger.isTraceEnabled()) {
      logger.trace("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.
   // 这里是一个arrayList,即先入先出,所以bean的创建顺序是根据Bean定义的顺序决定的
   List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);

   // Trigger initialization of all non-lazy singleton beans...
   for (String beanName : beanNames) {
       // 执行beanDefintion的合并,返回RootBeanDefinition。RootBeanDefinition和其他BeanDefinition的重要区别就在于root没有parentName,而且为了提升性能,在root中有很多 caching 缓存操作
      RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
      // 循环加载单例的、非延迟加载的bean
      if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
          // 判断是不是 FactoryBean,如果是的话,创建前要加前缀 &
         if (isFactoryBean(beanName)) {
            Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
            if (bean instanceof SmartFactoryBean<?> smartFactoryBean && smartFactoryBean.isEagerInit()) {
                // 通过beanName创建bean
               getBean(beanName);
            }
         }
         else {
             // 通过beanName创建bean
            getBean(beanName);
         }
      }
   }

   // Trigger post-initialization callback for all applicable beans...
   // 触发 SmartInitializingSingleton#afterSingletonsInstantiated 的回调
   for (String beanName : beanNames) {
      Object singletonInstance = getSingleton(beanName);
      if (singletonInstance instanceof SmartInitializingSingleton smartSingleton) {
         StartupStep smartInitialize = this.getApplicationStartup().start("spring.beans.smart-initialize")
               .tag("beanName", beanName);
         smartSingleton.afterSingletonsInstantiated();
         smartInitialize.end();
      }
   }
}

所以这里创建的重点就在于org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String) 这其中关于bean的创建是方法 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[]) 在 creataBean中的执行流程

AbstractAutowireCapableBeanFactory#createBean.png 这里 doCreateBean又是重重点。

doCreateBean.png