当前位置: 首页 > news >正文

Spring-Bean的生命周期

目录

生命周期汇总

细分生命周期

1.实例化

2.属性赋值(依赖注入)

3.Aware接口

4.BeanPostProcessor接口

5.初始化

6.销毁

测试验证

        类结构

        业务类

        测试类


生命周期汇总

        Spring Bean 的生命周期见下图
        一定记忆好下图

        

细分生命周期

1.实例化

  当 Spring 容器加载配置文件时,会根据配置创建 Bean 的实例。这个阶段主要是进行对象实例的创建,使用无参构造方法或工厂方法。

2.属性赋值(依赖注入)

    Spring 容器会调用对象的 set 方法或使用注解来为 Bean 的属性进行赋值。这个阶段可以进行各种依赖关系的注入,比如通过构造函数、setter 方法、注解等方式。

3.Aware接口

用来让 Bean 对某些特定信息感知(aware)的接口,它们可以通过实现相应的 Aware 接口来获取容器的相关信息。在 Bean 初始化的过程中,进行一些自定义的操作,例如对 Bean 的名称、工厂、上下文等进行操作或者引用
对应接口有三个:

  1. BeanNameAware:获取自己在 Spring 容器中的名称,即 Bean 的 ID。通过调用 setBeanName() 方法传入 Bean 的名称。

  2. BeanFactoryAware:获取到所属的 BeanFactory,即 Spring 容器本身的引用。通过调用 setBeanFactory() 方法传入 BeanFactory 的引用。

  3. ApplicationContextAware:获取到所属的 Spring 应用上下文的引用。通过调用 setApplicationContext() 方法传入 ApplicationContext 的引用。

4.BeanPostProcessor接口

  1. postProcessBeforeInitialization(Object bean, String beanName):

    • 该方法在 Bean 的初始化之前被调用。
    • 返回值为 Object,表示修改或替换原始的 Bean 对象。
    • 可以用来实现一些预处理操作,例如属性赋值或依赖注入。
    • 应用举例:对bean中指定属性加解密,如下代码👇
  2. postProcessAfterInitialization(Object bean, String beanName):

    • 该方法在 Bean 的初始化之后被调用。
    • 返回值为 Object,表示修改或替换原始的 Bean 对象。
    • 可以用来实现一些后处理操作,例如添加额外的功能或修改 Bean 实例,常见应用场景如AOP
@Component
public class UserService implements BeanPostProcessor {private String password;// Getter and Setter for password@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof UserService) {UserService userService = (UserService) bean;// 在这里对 password 进行解密操作String decryptedPassword = decrypt(userService.getPassword());userService.setPassword(decryptedPassword);}return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {return bean;}private String decrypt(String encryptedPassword) {// 实现解密逻辑// ...return decryptedPassword;}
}

5.初始化

    在属性赋值完成后,Spring 容器会调用 Bean 的初始化方法(可以通过实现 InitializingBean 接口或自定义初始化方法(自定义的示例如下👇)来指定),进行一些初始化操作,比如连接数据库、加载数据等。

    @PostConstructpublic void init() {System.out.println("自定义初始化方法");}

6.销毁

    当 Spring 容器关闭或移除 Bean 时,会调用 Bean 的销毁方法(可以通过实现 DisposableBean 接口或配置 destroy-method 方法来指定)。在这个阶段可以进行一些资源释放、清理操作,比如关闭数据库连接、释放文件句柄等。

测试验证

git地址:先跟着流程图记忆好生命周期,根据自己理解到的自己手写
SpringBean: SpringBean生命周期

如下是截图参考,根据自己喜好选择clone代码或者截图

        类结构

        业务类

        测试类

public class UserTest {public static void main(String[] args) {AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);User user = ctx.getBean(User.class);System.out.println(user);}
}

        根据控制台打印即可看到Bean的生命周期执行过程 
        如果想掌握本篇,那就静下心 动起手 搞一遍

http://www.lryc.cn/news/129005.html

相关文章:

  • Cat(3):客户端集成—简单案例
  • 虚拟机/双系统Ubuntu扩容
  • Nginx搭建本地服务器,无需购买服务器即可测试vue项目打包后的效果
  • SpringBoot 接口调用出现乱码解决 中文乱码
  • JDBC封装与设计模式
  • 小程序扫描二维码获取网址,通过Jsoup进行解析
  • Kubernetes+EFK构建日志分析平台
  • 客服如何减轻工作压力?浅析客服压力管理方法
  • 知识储备--基础算法篇-二分搜索
  • 【MySQL系列】表内容的基本操作(增删查改)
  • docker搭建LNMP
  • 未出现过的最小正整数
  • 易服客工作室:WordPress是什么?初学者的解释
  • 2019年9月全国计算机等级考试真题(C语言二级)
  • LLaMA模型泄露 Meta成最大受益者
  • 企业中商业智能BI,常见的工具和技术
  • item_password-获得淘口令真实url
  • 基于SOLIDWORKS配置功能建立塑料模具标准件库
  • 1.物联网LWIP网络,TCP/IP协议簇
  • 拷贝公钥文件后,ssh 服务器仍提示输入密码
  • 算法|Day45 动态规划13
  • 基于随机森林的手写体数字识别,基于RF的手写体数字识别,基于RF的MNIST数据集分类识别
  • vite初始化vue3项目(配置自动格式化工具与git提交规范工具)
  • leetcode473. 火柴拼正方形(回溯算法-java)
  • git-fatal: No url found for submodule path ‘packages/libary‘ in .gitmodules
  • Android开发之性能优化:过渡绘制解决方案
  • Wireshark 抓包过滤命令汇总
  • 配资平台app(正规股票配资软件)架构是怎么搭建的?
  • 【实用黑科技】如何 把b站的缓存视频弄到本地——数据恢复软件WinHex 和 音视频转码程序FFmpeg
  • 神经网络基础-神经网络补充概念-57-多任务学习