一、背景:
自动注入 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
方法,将赋值操作放在这里方法里,这个方法会在对象初始化时执行。