Spring的refresh()方法调用过程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/who246/article/details/54883901

Spring的refresh()方法调用过程

refresh()是Spring中比较核心的方法,Spring所有的初始化都在这个方法中完成

具体代码如下

public void refresh() throws BeansException, IllegalStateException {
        synchronized (this.startupShutdownMonitor) {
            // Prepare this context for refreshing.
            prepareRefresh();

            // Tell the subclass to refresh the internal bean factory.
            ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

            // Prepare the bean factory for use in this context.
            prepareBeanFactory(beanFactory);

            try {
                // Allows post-processing of the bean factory in context subclasses.
                postProcessBeanFactory(beanFactory);

                // Invoke factory processors registered as beans in the context.
                invokeBeanFactoryPostProcessors(beanFactory);

                // Register bean processors that intercept bean creation.
                registerBeanPostProcessors(beanFactory);

                // 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) {
                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;
            }
        }
    }

Spring中refresh调用过程

//准备工作包括设置启动时间,是否激活标识位,初始化属性源(property source)配置

prepareRefresh();

//创建beanFactory(过程是根据xml为每个bean生成BeanDefinition并注册到生成的beanFactory)

ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

//准备创建好的beanFactory(给beanFactory设置ClassLoader,设置SpEL表达式解析器,设置类型转化器【能将xml String类型转成相应对象】,增加内置ApplicationContextAwareProcessor对象,忽略各种Aware对象,注册各种内置的对账对象【BeanFactory,ApplicationContext】等,注册AOP相关的一些东西,注册环境相关的一些bean

prepareBeanFactory(ConfigurableListableBeanFactory beanFactory)

//实例化并调用BeanFactory中扩展了BeanFactoryPostProcessor的Bean的postProcessBeanFactory方法

invokeBeanFactoryPostProcessors(beanFactory);

//实例化和注册beanFactory中扩展了BeanPostProcessor的bean

registerBeanPostProcessors(beanFactory)方法;

//实例化,注册和设置国际化工具类MessageSource

initMessageSource();

//实例化,注册和设置消息广播类(如果没有自己定义使用默认的SimpleApplicationEventMulticaster实现,此广播使用同步的通知方式)

initApplicationEventMulticaster();

//设置样式工具ThemeSource

onRefresh();

//添加用户定义的消息接收器到上面设置的消息广播ApplicationEventMulticaster

registerListeners();

//设置自定义的类型转化器ConversionService,设置自定义AOP相关的类LoadTimeWeaverAware,清除临时的ClassLoader,冻结配置(没看明白干什么的),实例化所有的类(懒加载的类除外)

finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory);

//注册和设置跟bean生命周期相关的类(默认使用DefaultLifecycleProcessor),调用扩展了SmartLifecycle接口的start方法,使用上注册的广播类消息广播类ApplicationEventMulticaster广播ContextRefreshedEvent事件

finishRefresh();

阅读更多

没有更多推荐了,返回首页