【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(): 清空缓存
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
视频详细讲解需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 1、课程简介 Spring框架是一系列应用框架的核心,也可以说是整合其他应用框架的基座。同时还是SpringBoot的基础。在当下的市场开发环境中,Spring占据的地位是非常高的,基本已经成为了开发者绕不过去的框架了。它里面包含了SpringSpringMVC,SpringData(事务),SrpingTest等等。 其中: Spring本身里面包含了两大核心IOC和AOP。IOC负责降低我们代码间的依赖关系,使我们的项目灵活度更高,可复用性更强。AOP是让方法间的各个部分更加独立,达到统一调用执行,使后期维护更加的方便。 SpringMVC本身是对Servlet和JSP的API进行了封装,同时在此基础上进一步加强。它推出的一套注解,可以降低开发人员的学习成本,从而更轻松的做表现层开发。同时,在3.x版本之后,它开始之初Rest风格的请求URL,为开发者提供了开发基于Restful访问规则的项目提供了帮助。 SpringData是一组技术合集。里面包含了JDBC,Data JPA,Data Redis,Data Mongodb,Data Rabbit,Data ElasticSearch等等。合集中的每一项都是针对不同数据存储做的简化封装,使我们在操作不同数据库时,以最简洁的代码完成需求功能。 SpringTest它是针对Junit单元测试的整合。让我们在开发中以及开发后期进行测试时,直接使用Junit结合spring一起测试。 本套课程中,我们将全面剖析SpringSpringMVC两个部分。从应用场景分析,到基本用法的入门案例,再到高级特性的分析及使用,最后是执行原理的源码分析。让学生通过学习本套课程不仅可以知其然,还可以知其所以然。最终通过一个综合案例,实现灵活运用Spring框架中的各个部分。 2、适应人群 学习spring,要有一定的Java基础,同时应用过spring基于xml的配置。(或者学习过官网的Spring课程) 学习springmvc,要有一定java web开发基础。同时对spring框架要有一定了解。 3、课程亮点 系统的学习Spring框架中各个部分,掌握Spring中一些高级特性的使用。 l Spring IoC n 设计模式-工厂模式 n 基础应用-入门案例 n 基础应用-常用注解使用场景介绍及入门 n 高级特性-自定义BeanNameGenerator n 高级特性-自定义TypeFilter n 高级特性-ImportSelector和ImportBeanDefinitionRegistrar的分析 n 高级特性-自定义ImportSelector n 高级特性-FilterType中的AspectJTypeFilter的使用 n 高级特性-自定义ImportBeanDefinitionRegistrar n 高级特性-自定义PropertySourceFactory实现解析yaml配置文件 n 源码分析-BeanFactory类视图和常用工厂说明 n 源码分析-AnnotationConfigApplicationContext的register方法 n 源码分析-AnnotationConfigApplicationContext的scan方法 n 源码分析-AbstractApplicationContext的refresh方法 n 源码分析-AbstractBeanFactory的doGetBean方法 l Spring Aop n 设计模式-代理模式 n 编程思想-AOP思想 n 基础应用-入门案例 n 基础应用-常用注解 n 高级应用-DeclareParents注解 n 高级应用-EnableLoadTimeWeaving n 源码分析-@EnableAspectJAutoproxy注解加载过程分析 n 源码分析-AnnotationAwareAspectJAutoProxyCreator n 技术详解-切入点表达式详解 l Spring JDBC n 基础应用-JdbcTemplate的使用 n 源码分析-自定义JdbcTemplate n 设计模式-RowMapper的策略模式 n 高级应用-NamedParameterJdbcTemplate的使用 n 源码分析-TransactionTemplate n 源码分析-DataSourceUtils n 源码分析-TransactionSynchronizationManager

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值