你天天用 Spring 容器,但可能根本不知道它的本质
很多人第一次接触 Spring 时,都听过一句话:
Spring 是一个容器
但继续问:
容器是什么?很多人突然就不会了
有人说:容器就是装 Bean 的地方
也有人说:容器就是 BeanFactory
还有人说:ApplicationContext
这些都没错
但:都没有回答本质
因为:如果只是装对象:
Map<String,Object>
也能装
那为什么 Spring 要搞出这么复杂一套东西?
标题一、如果只是存对象,一个 Map 就够了
比如:
Map<String,Object> map = new HashMap<>();
map.put( "userService", new UserService());
取:
UserService service =(UserService)map.get("userService");
是不是已经:
能存
能取
能复用
看起来:已经像一个简单容器了
那 Spring 为什么不直接这样干?
因为:Spring 从来不只是想:“存对象”
二、Spring 真正关心的是对象的完整生命周期
前两篇已经讲过:
Spring 真正想拿走的是:对象控制权
既然接管:它就不能只负责:创建一下
还得负责:
什么时候创建
创建依赖谁
是否单例
是否延迟加载
是否需要代理
是否开启事务
生命周期怎么走
这意味着:Spring 容器不是对象仓库
而是:对象管理中心
三、Spring 容器更像一个“对象操作系统”
换个角度
很多人把 Spring 容器理解成:仓库
其实不太准确
它更像:操作系统
为什么?
因为操作系统也干类似的事:
创建进程
↓
分配资源
↓
调度
↓
管理生命周期
↓
销毁
Spring:
创建Bean
↓
注入依赖
↓
增强代理
↓
管理生命周期
↓
销毁
突然发现:很像
所以:
Spring 真正干的事情不是:存对象
而是:编排对象。
四、Spring 容器内部到底保存什么?
很多人以为:
Spring 启动:
new UserService()
结束。
其实不是
Spring 首先保存:
BeanDefinition
里面记录:
Bean 类型
依赖关系
是否单例
初始化方法
是否懒加载
作用域
相当于:对象档案
然后:真正需要时:
BeanDefinition
↓
创建对象
↓
注入依赖
↓
增强
↓
Bean
所以:Spring 容器管理的,不只是对象
还有:对象规则
五、为什么 Spring 几乎所有能力都依赖容器?
因为:
事务:需要容器创建代理
AOP:需要容器增强对象
@Autowired:需要容器注入依赖
生命周期:需要容器回调
如果脱离容器:
new OrderService();
这些能力直接失效
所以很多时候,不是Spring 不工作
而是:Spring 容器没接管
六、最后再回到那个问题:你天天用 Spring 容器,但可能根本不知道它的本质
不是:Map
不是:Bean仓库
甚至也不是:BeanFactory
它真正本质是:对象管理中心,或者对象操作系统
因为:它做的不只是,创建对象
而是:
定义
↓
创建
↓
装配
↓
增强
↓
生命周期管理
↓
销毁
这才是:Spring 容器真正干的事
关于老潘:
持续拆 Spring、MySQL、Redis 底层原理,复盘真实线上问题。
一起把“会用”变成“看懂”。
如果有帮助,点个赞、收藏支持一下。
下一篇:Bean 为什么需要生命周期?90%的人只会背流程
感兴趣可以关注,避免刷着刷着找不到。
更多推荐
所有评论(0)