【Spring】Bean生命周期

71 阅读1分钟

一、背景:

自动注入 UserService 对象, UserService 结构如下

在这里插入图片描述

二、创建 Bean 的整体流程:

UserService.class ------> 无参的构造方法 ------> 普通对象(无值) ------> 依赖注入 ------> 初始化前(@PostConstruct) ------> 初始化 Bean (InnitializaingBean) ------> 初始化后 (AOP)------> 代理对象 ------> 放入单例池 Map ------> Bean对象

获取 Bean 对象代码:

通过如下代码,我们可以判断 Bean 对象是否创建成功

在这里插入图片描述

三、各阶段详解

1. 依赖注入阶段:

这个阶段主要是通过反射寻找对象的那个属性上有 @Autowired 注解,伪代码如下:

在这里插入图片描述 2. Bean 如何实现单例 —— 即每次返回的都是同一个 Bean 对象

通过创建单例池实现 ,具体方式为:使用一个 Map<beanName, Bean 对象> 存储,这个 Map 的键为 Bean 对象的名字 (UserService),Map 的值为 Bean 第一次创建的 Bean对象 (new UserService()),每次获取 Bean 对象 都去这个单例池查找就可以保证每次返回的都是同一个 Bean 对象

3. 如何使得我们的 Bean 对象创建好了就带有我们需要的值,而不是创建完了再去赋值

  • 方法一: 在初始化前处理 对每个对象,自动注入时为赋值方法加上 @PostConstruct 注解,这样的方法在自动注入时就会被执行,我们的赋值方法也可以加在这里

在这里插入图片描述

实现这一操作的伪代码:也是通过反射,扫描各个方法上的注解

在这里插入图片描述

  • 方法二: 在初始化时执行 实现 InitializingBean 接口,重写 afterPropertiesSet 方法,将赋值操作放在这里方法里,这个方法会在对象初始化时执行。

在这里插入图片描述