Spring 注解学习笔记_容器启动

该系列学习笔记均是笔者通过学习某站雷丰阳老师的相关课程并结合 spring 2.* 版本源码自行整理出来的。如果有叙述不到位或者有误的地方烦请各位读者评论区给予指正,大家共同学习。
同时关于容器启动源码极为重要,未避免笔者水平误导读者,此处给出笔者认为写得很棒的一篇文章


Spring 容器的创建执行逻辑集中在 refresh 函数

@Override
public void refresh() throws BeansException, IllegalStateException {
   synchronized (this.startupShutdownMonitor) {
      // Spring 容器刷新前的预准备工作
      prepareRefresh();

      // 新建一个 beanFactory 并为其设置唯一 id 唯一标识
      ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

      // 对新建的 beanFactory 进行预处理工作
      prepareBeanFactory(beanFactory);

      try {

         // 依次调用 BeanDefinitionRegistryPostProcessor::postProcessBeanDefinitionRegistry 和 BeanFactoryPostProcessor::postProcessBeanFactory 方法
         invokeBeanFactoryPostProcessors(beanFactory);

         // 向容器中注册 BeanPostProcessor
         registerBeanPostProcessors(beanFactory);

         // 初始化 MessageSource 组件
         initMessageSource();

         // 初始化事件派发器
         initApplicationEventMulticaster();

         // 将项目中的所有 ApplicationListener 注册进入容器
         registerListeners();

         // 初始化所有剩下的单实例 bean
         finishBeanFactoryInitialization(beanFactory);

         // Last step: publish corresponding event.
         finishRefresh();
      } catch (BeansException ex) {}
      finally {}
   }
}
  • prepareRefresh() 进行 Spring 容器刷新前的预准备工作
    protected void prepareRefresh() {
       // 记录容器的启动时间
       this.startupDate = System.currentTimeMillis();
       this.closed.set(false);
       this.active.set(true);
      
       // 验证 Spring 环境变量中属性的合法性
       getEnvironment().validateRequiredProperties();
    
       // 存储容器刷新前注册的本地 ApplicationListener
       if (this.earlyApplicationListeners == null) {
          this.earlyApplicationListeners = new LinkedHashSet<>(this.applicationListeners);
       }
       else {
          // 重置 applicationListeners
          this.applicationListeners.clear();
          this.applicationListeners.addAll(this.earlyApplicationListeners);
       }
    
       // 新建 set 保存在事件派发器配置完成之前发布的事件
       this.earlyApplicationEvents = new LinkedHashSet<>();
    }
    
  • obtainFreshBeanFactory() 用于获取 BeanFactory
    protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
       refreshBeanFactory();
       return this.beanFactory;
    }
    
    @Override
    protected final void refreshBeanFactory() throws IllegalStateException {
       this.beanFactory = new DefaultListableBeanFactory();
       // 为新创建的 beanFactory 设置一个唯一 id
       this.beanFactory.setSerializationId(getId());
    }
    
  • prepareBeanFactory(beanFactory) 对新建的 beanFactory 进行预处理工作
    protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
       // 设置 beanFactory 的类加载器、表达式解析器
       beanFactory.setBeanClassLoader(getClassLoader());
       beanFactory.setBeanExpressionResolver(new 
                                             StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
    
       // 添加 ApplicationContextAwareProcessor implements BeanPostProcessor
       beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
       // 设置容器中忽略的自动装配接口
       beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
       beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
       beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
       beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
       beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
       beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
    
       // 设置可以自动解析的自动装配 => 可以在任何组件中自动注入
       beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
       beanFactory.registerResolvableDependency(ResourceLoader.class, this);
       beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
       beanFactory.registerResolvableDependency(ApplicationContext.class, this);
    
       // 添加 ApplicationListenerDetector implements BeanPostProcessor
       // 用于检测添加到容器中的 Bean 对象是否 instanceof ApplicationListener
       beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
    
       // 注册默认环境 Bean => 可以在任何组件中自动注入
       if (!beanFactory.containsLocalBean("environment")) {
          beanFactory.registerSingleton("environment", getEnvironment());
       }
       if (!beanFactory.containsLocalBean("systemProperties")) {
          beanFactory.registerSingleton("systemProperties", getEnvironment().getSystemProperties());
       }
       if (!beanFactory.containsLocalBean("systemEnvironment")) {
          beanFactory.registerSingleton("systemEnvironment", getEnvironment().getSystemEnvironment());
       }
    }
    
  • invokeBeanFactoryPostProcessors(beanFactory) 依次调用 BeanDefinitionRegistryPostProcessor::postProcessBeanDefinitionRegistry 和 BeanFactoryPostProcessor::postProcessBeanFactory 方法
    public static void invokeBeanFactoryPostProcessors(
          ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
          List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
      
          // 先获取容器中所有 BeanDefinitionRegistryPostProcessor
          String[] postProcessorNames =
                beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
          for (String ppName : postProcessorNames) {
             // 优先执行 list(BeanDefinitionRegistryPostProcessor) 中所有继承 PriorityOrdered
             if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                processedBeans.add(ppName);
             }
          }
          sortPostProcessors(currentRegistryProcessors, beanFactory);
          registryProcessors.addAll(currentRegistryProcessors);
          // 执行 currentRegistryProcessors 集合中所有继承 PriorityOrdered 的 BeanDefinitionRegistryPostProcessor::postProcessBeanDefinitionRegistry 方法
          invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
          // 将 currentRegistryProcessors 集合清空,进行下一轮反射执行目标方法
          currentRegistryProcessors.clear();
    
          // 再执行 list(BeanDefinitionRegistryPostProcessor) 中所有继承 Ordered
      
          // 执行 currentRegistryProcessors 集合中所有继承 Ordered 的 BeanDefinitionRegistryPostProcessor::postProcessBeanDefinitionRegistry 方法
    
          // 最后执行 list(BeanDefinitionRegistryPostProcessor) 中所有未继承上述两种接口
          
          // 执行 currentRegistryProcessors 集合中所有未继承上述两种接口的 BeanDefinitionRegistryPostProcessor::postProcessBeanDefinitionRegistry 方法
    
       else {}
    
       // 再获取容器中所有 BeanFactoryPostProcessor
       String[] postProcessorNames =
             beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
    
       // Separate between BeanFactoryPostProcessors that implement PriorityOrdered, Ordered, and the rest.
       List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
       List<String> orderedPostProcessorNames = new ArrayList<>();
       List<String> nonOrderedPostProcessorNames = new ArrayList<>();
    
       sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
       // 优先执行 list(BeanFactoryPostProcessor) 中所有继承 PriorityOrdered 的 BeanFactoryPostProcessor::postProcessBeanFactory
       invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
    
       List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
       for (String postProcessorName : orderedPostProcessorNames) {
          orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
       }
       sortPostProcessors(orderedPostProcessors, beanFactory);
       // 再执行 list(BeanFactoryPostProcessor) 中所有继承 Ordered 的 BeanFactoryPostProcessor::postProcessBeanFactory
       invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
    
       List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
       for (String postProcessorName : nonOrderedPostProcessorNames) {
          nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
       }
       // 最后执行 list(BeanFactoryPostProcessor) 中所有未继承上述两种接口的 BeanFactoryPostProcessor::postProcessBeanFactory
       invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
    }
    
  • registerBeanPostProcessors(beanFactory) 注册 BeanPostProcessor
    public static void registerBeanPostProcessors(
          ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
    
       String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
    
       // Separate between BeanPostProcessors that implement PriorityOrdered, Ordered, and the rest.
       List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
       List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
       List<String> orderedPostProcessorNames = new ArrayList<>();
       List<String> 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);
          }
       }
    
       sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
       // 优先注册 PriorityOrdered 优先级接口的 BeanPostProcessor
       registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
    
       // 再注册 Ordered 接口的 BeanPostProcessor
       List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
       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);
    
       // 最后注册没有实现任何优先级接口的 BeanPostProcessors
       List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
       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);
       // 再将 internalPostProcessors 集合中保存的 MergedBeanDefinitionPostProcessor 进行注册
       registerBeanPostProcessors(beanFactory, internalPostProcessors);
       
       // 注册一个 ApplicationListenerDetector 用于检测 Bean 对象是否 implements ApplicationListener
       // 如果是 applicationContext.addApplicationListener((ApplicationListener<?>) bean)
       beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
    }
    
  • initMessageSource() 初始化 MessageSource 组件(用于国际化,消息绑定,消息解析)
    protected void initMessageSource() {
       // 获取之前创建的 beanFactory
       ConfigurableListableBeanFactory beanFactory = getBeanFactory();
       // 判断容器中是否有 id = "messageSource" 的组件
       if (beanFactory.containsLocalBean("messageSource")) {
          // 存在,则获取 id = "messageSource" class = MessageSource.class 的组件
          this.messageSource = beanFactory.getBean("messageSource", MessageSource.class);
          if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
             HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
             if (hms.getParentMessageSource() == null) {
                hms.setParentMessageSource(getInternalParentMessageSource());
             }
          }
       }
       else {
          // 容器中不存在则新建 DelegatingMessageSource,且注册进 beanFactory => 可以在任何组件注入
          DelegatingMessageSource dms = new DelegatingMessageSource();
          this.messageSource = dms;
          beanFactory.registerSingleton("messageSource", this.messageSource);
       }
    }
    
  • initApplicationEventMulticaster() 初始化事件派发器
    protected void initApplicationEventMulticaster() {
       ConfigurableListableBeanFactory beanFactory = getBeanFactory();
       // 尝试从容器中获取 id = "applicationEventMulticaster" 的事件派发器
       if (beanFactory.containsLocalBean("applicationEventMulticaster")) {
          this.applicationEventMulticaster =
                beanFactory.getBean("applicationEventMulticaster", ApplicationEventMulticaster.class);
       }
       else {
          // 获取失败,注入 id = "applicationEventMulticaster" 的事件派发器 
          this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
          beanFactory.registerSingleton("applicationEventMulticaster", this.applicationEventMulticaster);
       }
    }
    
  • registerListeners() 将项目中的所有 ApplicationListener 注册进入容器
    protected void registerListeners() {
    
       // 获取容器中所有 ApplicationListener 类型的 Bean 即监听器
       String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
       for (String listenerBeanName : listenerBeanNames) {
          // 将 ApplicationListener 添加到事件派发器
          getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
       }
    
       // 获取之前保存在事件派发器配置完成之前发布的事件的 set
       Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
       this.earlyApplicationEvents = null;
       if (earlyEventsToProcess != null) {
          for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
             // 将这些 event 利用事件派发器发布
             getApplicationEventMulticaster().multicastEvent(earlyEvent);
          }
       }
    }
    
  • finishBeanFactoryInitialization(beanFactory) 初始化所有剩下的单实例 bean
    protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
    
       // 初始化所有剩下的单实例 bean
       beanFactory.preInstantiateSingletons();
    }
    
    @Override
    public void preInstantiateSingletons() throws BeansException {
    
       // 获取容器中的所有 Bean,依次进行初始化和创建对象
       List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
    
       for (String beanName : beanNames) {
          // 获取 Bean 的定义信息
          RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
          // 如果 Bean 对象 非抽象 单实例 非懒加载
          if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
             // if (beanInstance instanceof FactoryBean)
             if (isFactoryBean(beanName)) {
                // 通过 "&" + factoryBeanName 获取工厂本身的 Bean
                Object bean = getBean("&" + beanName);
                if (bean instanceof FactoryBean) {
                   final FactoryBean<?> factory = (FactoryBean<?>) bean;
                   else {}
                }
             }
             else {
                // 非工厂 bean 使用 genBean 创建 Bean 对象
                getBean(beanName);
             }
          }
       }
    
       // 判断容器中的 bean 是否 instanceof SmartInitializingSingleton
       // 如果是,则执行 SmartInitializingSingleton::afterSingletonsInstantiated
       for (String beanName : beanNames) {
          Object singletonInstance = getSingleton(beanName);
          if (singletonInstance instanceof SmartInitializingSingleton) {
             final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
             smartSingleton.afterSingletonsInstantiated();
          }
       }
    }
    
    • getBean(beanName) 创建 Bean 对象

      @Override
      public Object getBean(String name) throws BeansException {
         return doGetBean(name, null, null, false);
      }
      
      protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
            @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
      
         final String beanName = transformedBeanName(name);
         Object bean;
      
         // 先获取缓存中保存的单实例 Bean
         // 如果能获取到说明这个 Bean之 前被创建过(所有创建过的单实例Bean都会被缓存起来)
         Object sharedInstance = getSingleton(beanName);
         if (sharedInstance != null && args == null) {
            bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
         }
      
         else {
      		  // 获取失败,开始 Bean 的创建过程
            // 首先标记当前 Bean 已经被创建,用于多线程情况
            if (!typeCheckOnly) {
               markBeanAsCreated(beanName);
            }
      
            try {
               // 获取 Bean 的定义信息
               final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
      
               // 获取当前 Bean 对象的依赖信息,需要先创建 Bean 的依赖 Bean
               String[] dependsOn = mbd.getDependsOn();
               if (dependsOn != null) {
                  for (String dep : dependsOn) {
                     registerDependentBean(dep, beanName);
                     try {
                        // 存在依赖 Bean,先创建依赖 Bean 对象
                        getBean(dep);
                     }
                     catch (NoSuchBeanDefinitionException ex) {}
                  }
               }
      
               // 创建单实例 Bean
               if (mbd.isSingleton()) {
                  sharedInstance = getSingleton(beanName, () -> {
                     try {
                        // 创建单实例 Bean
                        return createBean(beanName, mbd, args);
                     }
                     catch (BeansException ex) {}
                  });
                  bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
               }
            } catch (BeansException ex) 
         }
      
         // Check if required type matches the type of the actual bean instance.
         if (requiredType != null && !requiredType.isInstance(bean)) {
            try {
               T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType);
               return convertedBean;
            }
            catch (TypeMismatchException ex) {}
         }
         return (T) bean;
      }
      
      • getSingleton(beanName, () -> { return createBean(beanName, mbd, args) }) 创建 Bean 对象并缓存
        public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
           synchronized (this.singletonObjects) {
              Object singletonObject = this.singletonObjects.get(beanName);
              if (singletonObject == null) {
                 boolean newSingleton = false;
                 try {
                    // 利用函数式接口 getObject => createBean(beanName, mbd, args) 创建单实例 Bean
                    singletonObject = singletonFactory.getObject();
                    newSingleton = true;
                 }
                 catch (IllegalStateException ex) {}
                 catch (BeanCreationException ex) {}
                 finally {}
                 if (newSingleton) {
                    // 将创建的 Bean 添加到缓存 singletonObjects 中
                    addSingleton(beanName, singletonObject);
                 }
              }
              return singletonObject;
           }
        }
        
      • getObject() => createBean(beanName, mbd, args) 创建单实例 Bean
        @Override
        protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
              throws BeanCreationException {
        
           RootBeanDefinition mbdToUse = mbd;
        
           try {
              // 利用 InstantiationAwareBeanPostProcessor::postProcessBeforeInstantiation 尝试获取当前 beanName 对应的代理对象
              Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
              if (bean != null) {
                 // 若存在代理对象直接 return
                 return bean;
              }
           }
           catch (Throwable ex) {}
        
           try {
              // 不存在代理对象,则创建单实例 Bean
              Object beanInstance = doCreateBean(beanName, mbdToUse, args);
              return beanInstance;
           }
           catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {}
           catch (Throwable ex) {}
        }
        
        • doCreateBean(beanName, mbdToUse, args) 创建单实例 Bean
          protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) throws BeanCreationException {
          
              // Instantiate the bean.
              BeanWrapper instanceWrapper = null;
              // 如果 Bean 对象为单实例
              if (mbd.isSingleton()) {
                  // 先尝试从缓存中获取
                  instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
              }
              if (instanceWrapper == null) {
                  // 获取失败则执行 Bean 对象构造方法 => 创建 Bean 对象
                  instanceWrapper = createBeanInstance(beanName, mbd, args);
              }
          
              // Initialize the bean instance.
              Object exposedObject = bean;
              try {
                  // 为创建的 Bean 对象进行属性赋值
                  populateBean(beanName, mbd, instanceWrapper);
                  // 执行 Bean 对象的初始化方法
                  exposedObject = initializeBean(beanName, exposedObject, mbd);
              }
              catch (Throwable ex) {}
          
              // Register bean as disposable.
              try {
                  // 将单实例 Bean 对象加入到 list 中,在容器销毁时会调用这个 list 中所有 Bean 对象的销毁方法
                  registerDisposableBeanIfNecessary(beanName, bean, mbd);
              }
              catch (BeanDefinitionValidationException ex) {}
          
              return exposedObject;
          }
          
          protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd)
          {
          
              Object wrappedBean = bean;
              if (mbd == null || !mbd.isSynthetic()) {
                  // 执行容器中所有的 BeanPostProcessor 执行其 postProcessBeforeInitialization 方法 
                  wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
              }
          
              try {
                  // 执行 Bean 对象的初始化方法
                  invokeInitMethods(beanName, wrappedBean, mbd);
              }
              catch (Throwable ex) {}
              if (mbd == null || !mbd.isSynthetic()) {
                  // 执行容器中所有的 BeanPostProcessor 执行其 postProcessAfterInitialization 方法 
                  wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
              }
          
              return wrappedBean;
          }
          
  • finishRefresh() 完成 BeanFactory 的初始化创建工作 => IOC容器创建完成
    protected void finishRefresh() {
    
       // 初始化和生命周期有关的后置处理器
       initLifecycleProcessor();
    
       // 获取之前的和生命周期有关的后置处理器,调用 onRefresh 方法
       getLifecycleProcessor().onRefresh();
    
       // 获取事件派发器,发布容器刷新完毕事件
       publishEvent(new ContextRefreshedEvent(this));
    }
    
    • initLifecycleProcessor() 初始化和生命周期有关的后置处理器
      protected void initLifecycleProcessor() {
         // 获取 beanFactory
         ConfigurableListableBeanFactory beanFactory = getBeanFactory();
         // 判断 beanFactory 中是否存在 id = "lifecycleProcessor" 的组件
         if (beanFactory.containsLocalBean("lifecycleProcessor")) {
            // 存在则获取 id = "lifecycleProcessor" 且 class = LifecycleProcessor.class 的组件
            this.lifecycleProcessor = beanFactory.getBean("lifecycleProcessor", LifecycleProcessor.class);
         }
         else {
            // 不存在则新建 DefaultLifecycleProcessor 并设置 id = "lifecycleProcessor"
            DefaultLifecycleProcessor defaultProcessor = new DefaultLifecycleProcessor();
            this.lifecycleProcessor = defaultProcessor;
            beanFactory.registerSingleton("lifecycleProcessor", this.lifecycleProcessor);
         }
      }
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值