Spring 这里有你所有想要知道的

220 阅读4分钟

【附录】相较于BeanFactory , ApplicationContext做了哪些企业化的增强?

【附录】Spring容器的启动过程是怎样的?

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 - 高级容器

ApplicationContextBeanFactory的子接口,提供了更多企业级功能:

【附录】相对于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有不同的实现类,常见的分别为ClassPathXmlApplicationContextAnnotationConfigApplicationContextFileSystemXmlApplicationContextWebApplicationContext

Spring框架多种容器实现类的继承关系图:

BeanFactory
↑
ApplicationContext
↑
ConfigurableApplicationContext
↑
AbstractApplicationContext
├── AbstractRefreshableApplicationContext
│   ├── AbstractRefreshableConfigApplicationContext
│   │   ├── ClassPathXmlApplicationContext
│   │   └── FileSystemXmlApplicationContext
│   └── (其他基于XML的实现)
└── GenericApplicationContext
    └── AnnotationConfigApplicationContext

(单独分支)
ApplicationContext
↑
WebApplicationContext
├── XmlWebApplicationContext
└── AnnotationConfigWebApplicationContext

【附录】Spring框架多种容器实现类的区别?

三、Spring容器的启动过程

注意:这里所有的容器启动,其实都是基于main方法的。不同的容器实现类,读取bean的方式不同,但最终都要进行context.refresh();即刷新容器,刷新容器有12大步骤。

【附录】Spring容器的启动过程是怎样的?

【附录】Spring Bean实例化过程是怎样的?

四、Spring框架对比原生Java做了什么优化?

即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框架的核心,它的本质是一个对象工厂,负责创建、配置和管理应用程序中的对象。