preInstantiateSingletons()方法——(三)

作用

        实例化所有剩余的(非懒加载的)单例bean。

确保实例化所有非惰性init单例,同时考虑

{@link org.springframework.beans.factory.FactoryBean FactoryBean}。

如果需要,通常在工厂设置结束时调用。

如果无法创建一个单例bean,@throws BeansException。

注意:这可能已经离开工厂,一些bean已经初始化!

在这种情况下,调用{@link#destroySingletons()}进行完全清理。

@Override
public void preInstantiateSingletons() throws BeansException {
   // 日志
   if (logger.isTraceEnabled()) {
      logger.trace("Pre-instantiating singletons in " + this);
   }

   // beanFactory里面的所有beanName
   List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);

   // 实例化开始
   for (String beanName : beanNames) {
      RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
      // 非抽象、单例、非懒加载的
      if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
         // FactoryBean子类型 :(beanInstance instanceof FactoryBean)
         if (isFactoryBean(beanName)) {
            // 获取bean   "&" + beanName
            Object bean = getBean(FACTORY_BEAN_PREFIX + beanName); 
            // FactoryBean子类型
            if (bean instanceof FactoryBean) {
               // 强转FactoryBean类型
               FactoryBean<?> factory = (FactoryBean<?>) bean;
               boolean isEagerInit;
               // 
               if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
                  isEagerInit = AccessController.doPrivileged(
                        (PrivilegedAction<Boolean>) ((SmartFactoryBean<?>) factory)::isEagerInit,
                        getAccessControlContext());
               }
               // 
               else {
                  isEagerInit = (factory instanceof SmartFactoryBean &&
                        ((SmartFactoryBean<?>) factory).isEagerInit());
               }
               if (isEagerInit) {
                  getBean(beanName);
               }
            }
         }
         else {
            getBean(beanName);
         }
      }
   }

   // 初始化回调
   for (String beanName : beanNames) {
      // 获取单例bean 
      Object singletonInstance = getSingleton(beanName);
      if (singletonInstance instanceof SmartInitializingSingleton) {
         StartupStep smartInitialize = this.getApplicationStartup().start("spring.beans.smart-initialize")
               .tag("beanName", beanName);
         SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
         if (System.getSecurityManager() != null) {
            AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
               smartSingleton.afterSingletonsInstantiated();
               return null;
            }, getAccessControlContext());
         }
         else {
            smartSingleton.afterSingletonsInstantiated();
         }
         smartInitialize.end();
      }
   }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值