SpringIOC源码解析(3)—— 高级容器

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: ApplicationContext家族体系ApplicationContex继承的接口ApplicationContext常用容器传统的基于XML配置的经典容器目前比较流行的容器(都是基于注解的)容器的共性ApplicationContext源码模板方法设计模式

ApplicationContext家族体系


44.png


高级容器均实现了ApplicationContex这个接口,为了区别于普通容器,高级容器一般被称为Contex(上下文),之所以是高级容器,因为它实现了更多的接口:

45.png

ApplicationContex继承的接口



464.png


Environment可以理解为容器的一些启动参数,类如java里的 -Dparam1=value1

对于web容器,还可以根据此获取到servlet的一些配置信息


继承了ListableBeanFactory意味着可以根据列表的方式管理bean


继承了HierarchicalBeanFactory意味着可以基于多层级的结构来实现每一层级对bean的管理


继承了ResourcePatternResolver可以加载资源文件,相当于ResourceLoader,分析beandefinition加载的时候会提到


继承了MessageSource可以管理一些Message,实现国际化等功能


继承了ApplicationEventPublisher可以具备事件发布的能力,容器启动的时候会注册一些Listener,就是用来监听容器发布的事件的(观察者设计者模式)


ApplicationContext常用容器


传统的基于XML配置的经典容器


FileSystemXmlApplicationContext:从文件系统加载配置

ClassPathXmlApplicationContext:从classpath加载配置

XmlWebApplicationContext:用于Web应用程序的容器


目前比较流行的容器(都是基于注解的)


AnnotationConfigServletWebServerApplicationContext

在springboot的boot模块下

AnnotationConfigReactiveWebServerApplicationContext

满足响应式容器需求,在springboot的boot模块下

AnnotationConfigApplicationContext

spring框架里,普通的非web应用基本都用这个


容器的共性


refresh()大致功能:


容器初始化、配置解析

BeanFactoryPostProcessor和BeanPostProcessor的注册和激活

国际化配置


ApplicationContext源码


46.png

都是一些get方法,只读的,所以还要利用子接口来实现它的可配置的能力

ConfigurableApplicationContext有一些set方法用来配置ApplicationContext


47.png


48.png


它继承了Lifecycle有start、stop等方法用于对容器的生命周期管理。Closeable是jdk相关接口,用于关闭容器时释放相关资源。


主要提供了refresh和close方法,refresh是主流容器都要做的事情,ApplicationContext被关闭时,refresh可重新启动容器,重新调用它会清除缓存、重新装载配置信息。


ConfigurableApplicationContext的最主要的实现类是AbstractApplicationContext,也是高级容器中最主要的类,实现了ApplicationContext接口中简单、不易动的部分,主要是容器工厂的处理:


49.png


发布事件


50.png


监听器的注册


51.png


容器初始化操作refresh方法


52.png


getBean方法

53.png


等等所有容器相关的方法,没有实现的也预留出了抽象方法以供子容器实现


模板方法设计模式


54.png


例如:

package demo.pattern.template;
public abstract class KTVRoom {
    public void procedure(){
        openDevice();
        orderSong();
        orderExtra();
        pay();
    }
    //模板自带方法,使用前必须得打开设备
    private void openDevice(){
        System.out.println("打开视频和音响");
    }
    //子类必须实现的方法,必须得选歌
    protected abstract void orderSong();
    //钩子,额外开销视情况选择
    protected void orderExtra(){};
    //模板自带方法,用后必须得付款
    private void pay(){
        System.out.println("支付本次的消费账单。。。");
    }
}


AbstractApplicationContext的refresh方法便是模板设计模式的一个很好的实践,refresh本身就是一个模板方法,主要定义了ApplicationContext下面的容器启动的时候要做什么事情:


prepareRefresh()方法,具体的实现由AbstractApplicationContext自己定义


55.png


obtainFreshBeanFactory(),里面的两个方法都是抽象方法,强制ApplicationContext的子类必须实现

56.png


3. prepareBeanFactory(beanFactory),为容器的某些子类指定特殊的BeanPost事件处理器,勾子方法

57.png



相关文章
|
19天前
|
监控 网络协议 Java
Tomcat源码解析】整体架构组成及核心组件
Tomcat,原名Catalina,是一款优雅轻盈的Web服务器,自4.x版本起扩展了JSP、EL等功能,超越了单纯的Servlet容器范畴。Servlet是Sun公司为Java编程Web应用制定的规范,Tomcat作为Servlet容器,负责构建Request与Response对象,并执行业务逻辑。
Tomcat源码解析】整体架构组成及核心组件
|
4天前
|
存储 缓存 Java
什么是线程池?从底层源码入手,深度解析线程池的工作原理
本文从底层源码入手,深度解析ThreadPoolExecutor底层源码,包括其核心字段、内部类和重要方法,另外对Executors工具类下的四种自带线程池源码进行解释。 阅读本文后,可以对线程池的工作原理、七大参数、生命周期、拒绝策略等内容拥有更深入的认识。
什么是线程池?从底层源码入手,深度解析线程池的工作原理
|
4天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
|
8天前
|
开发工具
Flutter-AnimatedWidget组件源码解析
Flutter-AnimatedWidget组件源码解析
|
26天前
|
测试技术 Python
python自动化测试中装饰器@ddt与@data源码深入解析
综上所述,使用 `@ddt`和 `@data`可以大大简化写作测试用例的过程,让我们能专注于测试逻辑的本身,而无需编写重复的测试方法。通过讲解了 `@ddt`和 `@data`源码的关键部分,我们可以更深入地理解其背后的工作原理。
22 1
|
24天前
|
监控 API 开发者
深入解析Docker容器的生命周期
【8月更文挑战第24天】
11 0
|
27天前
|
测试技术 持续交付 数据库
容器镜像解析问题之区分单元测试和集成测试如何解决
容器镜像解析问题之区分单元测试和集成测试如何解决
13 0
|
27天前
|
Java 测试技术 数据库
容器镜像解析问题之解析 Java 应用依赖时识别 jar 包如何解决
容器镜像解析问题之解析 Java 应用依赖时识别 jar 包如何解决
15 0
|
27天前
|
存储 容器
容器镜像解析问题之desc.Image() 方法确定返回的 Image 接口类型如何解决
容器镜像解析问题之desc.Image() 方法确定返回的 Image 接口类型如何解决
13 0
|
1月前
|
存储 NoSQL Redis
redis 6源码解析之 object
redis 6源码解析之 object
53 6

推荐镜像

更多