【附录】相较于BeanFactory , ApplicationContext做了哪些企业化的增强?
Spring容器的本质
什么是Spring容器?
容器是指能存放东西的一个器具,例如杯、碗、缸。在代码中,通过数据结构的构建,使得能在一个对象中获取到其他对象,Java中即包含了其他对象的引用,例如 List、Map。
Spring容器本质上是一个对象工厂,它负责创建、配置和管理应用程序中的对象(称为Bean)。容器是Spring框架的核心,所有的Spring功能都基于容器实现。
容器的核心作用
注意:这里说的 【 创建、配置、管理 】应用程序中的对象,我们该怎么理解?
【附录】举例说明Spring是如何进行 创建、配置和管理 对象的呢?
一、Spring容器的构成
Spring容器 分为 基础容器 BeanFactory和 高级容器ApplicationContext。
注意:这里说的 Spring容器 为 BeanFactory和ApplicationContext,需要思考,他们并没有用于储存bean的map或者list,为什么说他们是 spring的容器?
【附录】为什么说BeanFactory和ApplicationContext是Spring容器?
1. BeanFactory - 基础容器
BeanFactory是Spring容器的基础接口,提供了最基本的IoC功能:
注意:BeanFactory 提供“最基本的 IoC 功能”这一说法,本质在于它仅实现了 IoC 容器的核心契约——对象的生命周期管理和依赖注入,而省略了所有增强型扩展。
关键区别:ApplicationContext 在以上基础增加了AOP 集成、事件机制、国际化等企业级增强功能。
【附录】为什么说 Spring 中 BeanFactory的是延迟加载 和轻量级的?有什么证据?
2. ApplicationContext - 高级容器
ApplicationContext是BeanFactory的子接口,提供了更多企业级功能:
【附录】相对于BeanFactory ,ApplicationContext 做了哪些企业化的增强?
3. 容器的核心组件
这里主要是归纳了,Spring容器中收纳的bean,以及对Bean进行更改的通用方法
BeanDefinition - Bean定义
spring环境中 的BeanDefinition 来源是由哪些?如何理解 BeanDefinition ,他在spring中起到了什么作用?
【附录】在spring中BeanDefinition 来源是由哪些?如何理解 BeanDefinition ,他在spring中起到了什么作用?
BeanPostProcessor - Bean后处理器
BeanPostProcessor有不同的实现,不同的实现在功能上会有所不同,即在增强或改变bean的时间节点会有所不同,增强或改变的逻辑也有所不同。
【附录】BeanPostProcessor的作用时机与核心实现?
BeanFactoryPostProcessor - 工厂后处理器
BeanFactoryPostProcessor与上面的BeanPostProcessor 所增强的对象会有所不同。
【附录】BeanFactoryPostProcessor的作用时机与核心实现?
二、Spring容器的实现类
BeanFactory和ApplicationContext有不同的实现类,常见的分别为
ClassPathXmlApplicationContext、AnnotationConfigApplicationContext、FileSystemXmlApplicationContext和WebApplicationContext。
Spring框架多种容器实现类的继承关系图:
BeanFactory
↑
ApplicationContext
↑
ConfigurableApplicationContext
↑
AbstractApplicationContext
├── AbstractRefreshableApplicationContext
│ ├── AbstractRefreshableConfigApplicationContext
│ │ ├── ClassPathXmlApplicationContext
│ │ └── FileSystemXmlApplicationContext
│ └── (其他基于XML的实现)
└── GenericApplicationContext
└── AnnotationConfigApplicationContext
(单独分支)
ApplicationContext
↑
WebApplicationContext
├── XmlWebApplicationContext
└── AnnotationConfigWebApplicationContext
三、Spring容器的启动过程
注意:这里所有的容器启动,其实都是基于main方法的。不同的容器实现类,读取bean的方式不同,但最终都要进行context.refresh();即刷新容器,刷新容器有12大步骤。
四、Spring框架对比原生Java做了什么优化?
即Spring的诞生相对于原生Java有什么优化的地方。详细内容见文章:
| 对比维度 | 传统方式 | Spring容器方式 |
|---|---|---|
| 对象创建 | 开发者手动通过 new 关键字实例化对象。 | 容器(如 ApplicationContext)自动创建对象。 |
| 依赖管理 | 对象内部直接依赖具体实现(硬编码)。 | 容器通过 DI(依赖注入)自动装配依赖(松耦合)。 |
| 生命周期控制 | 开发者手动管理(如初始化、销毁)。 | 容器统一管理(支持 @PostConstruct、@PreDestroy 等)。 |
| 耦合度 | 类之间紧密耦合(直接依赖具体类)。 | 面向接口编程,依赖抽象(松耦合)。 |
| 配置方式 | 代码中硬编码配置(如数据库连接参数)。 | 集中式配置(XML、注解或 Java Config)。 |
| 可测试性 | 难以单元测试(依赖强耦合,需模拟复杂环境)。 | 易于测试(依赖可替换,如 Mock 注入)。 |
| 扩展性 | 修改依赖需改动代码(违反开闭原则)。 | 通过配置或注解动态替换实现(无需修改代码)。 |
| 典型代码示例 | java<br>UserService service = new UserServiceImpl();<br> | java<br>@Autowired<br>private UserService service;<br> |
| 依赖倒置原则(DIP) | 难以实现(高层模块依赖低层模块)。 | 天然支持(容器注入抽象依赖)。 |
| 适用场景 | 小型项目或无需灵活扩展的场景。 | 中大型项目、需解耦和动态管理的场景。 |
总结
Spring容器是Spring框架的核心,它的本质是一个对象工厂,负责创建、配置和管理应用程序中的对象。