【Spring源码讲解】refresh13个方法,Spring核心处理流程

需要将Spring源码整体看明白首先要看明白一个方法 refresh()
这个方法位于 AbstractApplicationContext类中。这个类里面包含了13个方法,这13个方法就是整个Spring核心的处理流程。

public abstract class AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext {
    public void refresh() throws BeansException, IllegalStateException {
        synchronized(this.startupShutdownMonitor) {
            /**
             * 前戏,做容器刷新前的准备工作
             * 1. 设置容器的启动时间
             * 2. 设置活跃状态为true
             * 3. 设置关闭状态为false
             * 4. 获取Environment对象,并加载当前系统的属性值到Environment对象中去
             * 5. 准备监听器和事件的集合对象,默认为空的集合
             */
            this.prepareRefresh();
            // 创建容器对象:DefaultListableBeanFactory
            // 加载xml配置文件的属性值到当前工厂中,最重要的就是BeanDefinition
            ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
            // beanFactory的准备工作,对各种属性进行填充
            this.prepareBeanFactory(beanFactory);

            try {
                // 子类覆盖方法做额外的处理,此处我们自己一般不做任何扩展工作,但是可以查看web中的代码是有具体实现的
                this.postProcessBeanFactory(beanFactory);
                // 调用各种beanFactory处理器
                this.invokeBeanFactoryPostProcessors(beanFactory);
                // 注册bean处理器,这里只是注册功能,真正调用的是getBean方法
                this.registerBeanPostProcessors(beanFactory);
                // 为上下文初始化message源,即不同语言的消息体,国际化处理,
                this.initMessageSource();
                // 初始化事件监听器多路广播器
                this.initApplicationEventMulticaster();
                // 留给子类来初始化其他的bean
                this.onRefresh();
                // 在所有注册的bean中查找listener bean,注册到消息广播器中
                this.registerListeners();
                // 实例化剩下的单实例(非懒加载的)
                this.finishBeanFactoryInitialization(beanFactory);
                // 完成属性过程,通知生命周期处理器lifecycleProcessor刷新过程,同时发出ContextRefreshEvent
                this.finishRefresh();
            } catch (BeansException var9) {
                if (this.logger.isWarnEnabled()) {
                    this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9);
                }
                // 为防止bean资源占用,在异常处理中,销毁已经在前面过程中生成的单件bean
                this.destroyBeans();
                // 重置active标志
                this.cancelRefresh(var9);
                throw var9;
            } finally {
                this.resetCommonCaches();
            }
        }
    }
}
  1. prepareRefresh(): 前期容器最基本的准备工作
  2. obtainFreshBeanFactory(): 创建出当前的容器对象,并解析xml文件和注解
    protected final void refreshBeanFactory() throws BeansException {
        if (this.hasBeanFactory()) {
            this.destroyBeans();
            this.closeBeanFactory();
        }
    
        try {
        	// 创建容器 其实就是return new DefaultListableBeanFactory()
            DefaultListableBeanFactory beanFactory = this.createBeanFactory();
            beanFactory.setSerializationId(this.getId());
            this.customizeBeanFactory(beanFactory);
            // 解析xml和注解,对BeanDefinition进行封装。BeanDefinition:所有xml配置和注解最终都会被读取到这个对象中去。
            this.loadBeanDefinitions(beanFactory);
            synchronized(this.beanFactoryMonitor) {
                this.beanFactory = beanFactory;
            }
        } catch (IOException var5) {
            throw new ApplicationContextException("I/O error parsing bean definition source for " + this.getDisplayName(), var5);
        }
    }
    
    还有另一个方法
  3. prepareBeanFactory(): beanFactory的准备工作,上一步只是new 了一个BeanFactory,没有对属性进行赋值,而在这一步对beanFactory进行属性赋值。
  4. postProcessBeanFactory():空方法,空方法意味着给子类进行扩展实现。
  5. invokeBeanFactoryPostProcessors(): 执行BeanFactoryPostProcessor
  6. registerBeanPostProcessors():
  7. initMessageSource(): 进行国际化配置的,不是很重要
  8. initApplicationEventMulticaster(): 观察者模式,广播器
  9. onRefresh(): 空方法,留给子类扩展使用。SpringBoot内嵌tomcat就是在这里实现的。
    springBoot中ServletWebServerApplicationContext对该方法进行了重写
    protected void onRefresh() {
        super.onRefresh();
        try {
        	// 此处创建了tomcat
            this.createWebServer();
        } catch (Throwable var2) {
            throw new ApplicationContextException("Unable to start web server", var2);
        }
    }
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = this.getServletContext();
        if (webServer == null && servletContext == null) {
            StartupStep createWebServer = this.getApplicationStartup().start("spring.boot.webserver.create");
            // 在这里获取到了 TomcatServletWebServerFactory
            ServletWebServerFactory factory = this.getWebServerFactory();
            createWebServer.tag("factory", factory.getClass().toString());
            this.webServer = factory.getWebServer(new ServletContextInitializer[]{this.getSelfInitializer()});
            createWebServer.end();
            this.getBeanFactory().registerSingleton("webServerGracefulShutdown", new WebServerGracefulShutdownLifecycle(this.webServer));
            this.getBeanFactory().registerSingleton("webServerStartStop", new WebServerStartStopLifecycle(this, this.webServer));
        } else if (servletContext != null) {
            try {
                this.getSelfInitializer().onStartup(servletContext);
            } catch (ServletException var5) {
                throw new ApplicationContextException("Cannot initialize servlet context", var5);
            }
        }
        this.initPropertySources();
    }
    
  10. registerListeners(): 监听器,与上面的广播器是配套的。用来监听广播的事件。在原生的Spring中这个用的不多,在SpringBoot中使用较多
  11. finishBeanFactoryInitialization(): 实例化剩下的单实例(非懒加载的)。也就是在此处完成Bean的生命周期,bean对象的创建工作。
  12. finishRefresh(): 进行一些扫尾工作
  13. resetCommonCaches(): 清空缓存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值