【Spring】Bean生命周期

一、背景:

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

在这里插入图片描述

二、创建 Bean 的整体流程:

UserService.class ------> 无参的构造方法 ------> 普通对象(无值) ------> 依赖注入 ------> 初始化前(@PostConstruct) ------> 初始化 Bean (InnitializingBean) ------> 初始化后 (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 对象 和 普通对象的区别:
同一个对象,只是处在不同的时期

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

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述
4. Bean 实例化和初始化的区别
Bean 实例化就是通过构造方法得到一个对象,初始化就是调用实例化出对象里定义的 afterPropertiesSet 方法

5. 什么是初始化后

初始化后执行 AOP ,生成代理对象,放入单例池,通过用代理对象使用 AOP 的逻辑。

6. 通过无参构造方法构造方法创建普通对象步骤细节

推断构造方法:

1)有一个构造方法,就用那一个
1) 有多个构造方法,选用无参的
2)不能有多个有参的构造方法(不含无参的),会报错,Spring 无法确定使用那个构造方法

在这里插入图片描述
7. 有参构造方法的值是如何传入的

去单例池中寻找,单例池查找方式为:先按照类的类型寻找

  • 找不到,直接创建新的,并返回
  • 找到一个,直接用这一个,不管名字
  • 若找到多个,则再按照名字匹配 ,没有名字匹配的,会报错

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
补充:依赖注入也是按上述逻辑寻找,先 By Type,再 By Name

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值