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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 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



相关文章
|
5天前
|
机器学习/深度学习 自然语言处理 算法
生成式 AI 大语言模型(LLMs)核心算法及源码解析:预训练篇
生成式 AI 大语言模型(LLMs)核心算法及源码解析:预训练篇
|
2月前
|
Kubernetes Linux 虚拟化
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
267 11
|
3月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
3月前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
3月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
2月前
|
自然语言处理 数据处理 索引
mindspeed-llm源码解析(一)preprocess_data
mindspeed-llm是昇腾模型套件代码仓,原来叫"modelLink"。这篇文章带大家阅读一下数据处理脚本preprocess_data.py(基于1.0.0分支),数据处理是模型训练的第一步,经常会用到。
62 0
|
4月前
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
87 12
|
3月前
|
PyTorch Shell API
Ascend Extension for PyTorch的源码解析
本文介绍了Ascend对PyTorch代码的适配过程,包括源码下载、编译步骤及常见问题,详细解析了torch-npu编译后的文件结构和三种实现昇腾NPU算子调用的方式:通过torch的register方式、定义算子方式和API重定向映射方式。这对于开发者理解和使用Ascend平台上的PyTorch具有重要指导意义。
|
3月前
|
负载均衡 网络协议 算法
Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式
本文探讨了Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式,以及软件负载均衡器、云服务负载均衡、容器编排工具等实现手段,强调两者结合的重要性及面临挑战的应对措施。
142 3
|
4月前
|
安全 持续交付 Docker
深入理解并实践容器化技术——Docker 深度解析
深入理解并实践容器化技术——Docker 深度解析
127 2

推荐镜像

更多