spring IOC - AnnotationConfigApplicationContext#refresh2

执行完前面的步骤后, 回到 org.springframework.context.support.AbstractApplicationContext#refresh 方法. @Override public void refresh() throws BeansException, IllegalStateEx...

执行完前面的步骤后, 回到 org.springframework.context.support.AbstractApplicationContext#refresh 方法.

@Override
public void refresh() throws BeansException, IllegalStateException {
    synchronized (this.startupShutdownMonitor) {
        // Prepare this context for refreshing.
        //准备工作包括设置启动时间,是否激活标识位, 初始化属性源(property source)配置
        //不重要
        prepareRefresh();

        // Tell the subclass to refresh the internal bean factory.
        //返回一个factory  - 为什么需要返回一个工厂
        //因为要对工厂进行初始化
        ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

        // Prepare the bean factory for use in this context.
        //为beanFactory设置一些属性如ClassLoader,BeanExpressionResolver,PropertyEditorRegistrar,BeanPostProcessor等
        //准备工厂
        prepareBeanFactory(beanFactory);

        try {
            // Allows post-processing of the bean factory in context subclasses.
            //这个方法在当前版本的spring是没用任何代码的
            //可能spring期待在后面的版本中去扩展吧
            postProcessBeanFactory(beanFactory);

            // Invoke factory processors registered as beans in the context.
            //为beanFactory注册BeanFactoryPostProcessor
            //在spring的环境中去执行已经被注册的 factory processors
            //设置执行自定义的ProcessBeanFactory 和spring内部自己定义的
            invokeBeanFactoryPostProcessors(beanFactory);

            // Register bean processors that intercept bean creation.
            //按照顺序注册当Bean创建时候的BeanPostProcessor
            //1. 注册实现了 PriorityOrdered 接口的后置处理器
            //2. 注册实现了 Ordered 接口的后置处理器
            //3. 注册其他的后置处理器
            registerBeanPostProcessors(beanFactory);

            // Initialize message source for this context.
            //初始化上下文的消息源:DelegatingMessageSource
            initMessageSource();

            // Initialize event multicaster for this context.
            //初始化了一个事件广播器:SimpleApplicationEventMulticaster
            initApplicationEventMulticaster();

            // Initialize other special beans in specific context subclasses.
            //空方法, 留着后面扩展用的
            onRefresh();

            // Check for listener beans and register them.
            //获取ApplicationListener,并在事件传播器中注册他们
            registerListeners();

            // Instantiate all remaining (non-lazy-init) singletons.
            //获取LoadTimeWeaverAware并初始化他们,初始化单例并且非懒加载的Bean
            finishBeanFactoryInitialization(beanFactory);

            // Last step: publish corresponding event.
            //完成refresh Context操作,初始化LifecycleProcessor并start,发布ContextRefreshedEvent事件
            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();
        }
    }
}

refresh 方法, 除了  invokeBeanFactoryPostProcessors() 比较重要外, 还有一个很重要的方法: finishBeanFactoryInitialization(beanFactory)

其他的几个方法, 看看就行, 都是一些注册, 初始化一些默认属性什么的, 属于前期的配置工作.

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 bean post-processor
    // (such as a PropertyPlaceholderConfigurer bean) registered any before:
    // at this point, primarily for resolution in annotation attribute values.
    if (!beanFactory.hasEmbeddedValueResolver()) {
        //设置一个内置的类型转换器 : StringValueResolver
        beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
    }

    // Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.
    // aspectj的, 基本用不着
    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.
    //实例化所有的单例对象
    beanFactory.preInstantiateSingletons();
}

preInstantiateSingletons 方法中, 就回去实例化容器里面注册的 bean.

//org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons
@Override
public void preInstantiateSingletons() throws BeansException {
    if (logger.isTraceEnabled()) {
        logger.trace("Pre-instantiating singletons in " + this);
    }
    //所有bean的名字
    // 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<String> beanNames = new ArrayList<>(this.beanDefinitionNames);

    // Trigger initialization of all non-lazy singleton beans...
    // 触发所有非延迟加载单例beans的初始化,主要步骤为调用getBean
    for (String beanName : beanNames) {
        //属性合并 : 合并父 BeanDefinition, xml中 bean 配置 parent=""
        RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
        // 非抽象 & 单例 & 非懒加载
        if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
            if (isFactoryBean(beanName)) {
                //如果是FactoryBean则加上&
                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<Boolean>)
                                        ((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...
    //当所有的bean都完成创建后, 调用他们的 SmartInitializingSingleton 接口的 afterSingletonsInstantiated 方法
    for (String beanName : beanNames) {
        Object singletonInstance = getSingleton(beanName);
        if (singletonInstance instanceof SmartInitializingSingleton) {
            final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
            if (System.getSecurityManager() != null) {
                AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
                    smartSingleton.afterSingletonsInstantiated();
                    return null;
                }, getAccessControlContext());
            }
            else {
                smartSingleton.afterSingletonsInstantiated();
            }
        }
    }
}

这里注意到两个点:

1. 首先遍历了容器里面注册的 beanName , 然后通过 getBean() 的方式, 将 beanName 转化成 bean.

2. 然后遍历所有的 bean, 调用其 SmartInitializingSingleton#afterSingletonsInstantiated() , 进行最后的初始化调用

  • 发表于 2020-07-27 21:41
  • 阅读 ( 82 )
  • 分类:网络文章

条评论

请先 登录 后评论
不写代码的码农
小编

篇文章

作家榜 »

  1. 小编 文章
返回顶部
部分文章转自于网络,若有侵权请联系我们删除