SpringBean的生命周期

秒速五厘米 2023-10-09 15:32 137阅读 0赞

SpringBean的生命周期

  • 一:前言
  • 二:什么是SpringBean的生命周期
  • 三:SpringBean与普通java对象的生命周期的不同
    • 3.1 普通java对象
    • 3.2 springBean对象
  • 四:springBean对象生命周期分析
    • 4.1宏观:
    • 4.2微观:
  • 五:SpringBean生命周期具体实例
    • 5.1 项目结构
    • 5.2 具体代码
      • 5.2.1 PersonBean
        • 5.2.1.1 代码解释
      • 5.2.2 定制处理器类
        • 5.2.2.1 代码解释
      • 5.2.3 springBean配置文件
  • 六:总结&提升

一:前言

下文要讲的均是spring的默认作用域singleton的bean的生命周期,对spring作用域不了解的可以参考我的这篇文章
springbean的作用域

二:什么是SpringBean的生命周期

springBean的生命周期,指的是spring里一个bean对象从出生到死亡的整个过程。解 Spring 生命周期的之后,可以利用 Bean 在其存活期间的指定时刻完成一些相关操作。这种时刻可能有很多,但一般情况下,会在 Bean 被初始化后和被销毁前执行一些相关操作。

三:SpringBean与普通java对象的生命周期的不同

3.1 普通java对象

  1. new的时候创建对象
  2. 对象不再使用,java自动进行垃圾回收

3.2 springBean对象

  1. 实例化
  2. 属性赋值
  3. 初始化
  4. 使用
  5. 销毁

四:springBean对象生命周期分析

4.1宏观:

在这里插入图片描述

4.2微观:

在这里插入图片描述
在上面两个图片中,我将springBean的生命周期分别从宏观和微观进行了表示,下面用一个例子来给大家看一下各个不同的生命周期

五:SpringBean生命周期具体实例

5.1 项目结构

此项目结构与springBean作用域项目结构一致,在这里就不多进行赘述
在这里插入图片描述

5.2 具体代码

5.2.1 PersonBean

PersonBean类,此类为我们要展示的bean对象

  1. package com.tfjy.test2;
  2. import org.springframework.beans.BeansException;
  3. import org.springframework.beans.factory.*;
  4. /**
  5. * @BelongsProject: demo
  6. * @BelongsPackage: com.tfjy.test2
  7. * @Author: haolizhuo
  8. * @Description: Bean的生命周期
  9. * @CreateTime: 2023-01-29 20:53
  10. * @Version: 1.0
  11. */
  12. public class PersonBean implements InitializingBean, BeanFactoryAware, BeanNameAware, DisposableBean {
  13. /**
  14. * 身份证号
  15. */
  16. private Integer no;
  17. /**
  18. * 姓名
  19. */
  20. private String name;
  21. //最先走的方法就是调用构造函数,创建具体对象
  22. public PersonBean() {
  23. System.out.println("1.调用构造方法:我出生了!");
  24. }
  25. public Integer getNo() {
  26. return no;
  27. }
  28. public void setNo(Integer no) {
  29. this.no = no;
  30. }
  31. public String getName() {
  32. return name;
  33. }
  34. public void setName(String name) {
  35. this.name = name;
  36. System.out.println("2.设置属性:我的名字叫" + name);
  37. }
  38. //BeanNameAware接口,通过这个接口设置bean的id
  39. @Override
  40. public void setBeanName(String s) {
  41. System.out.println("3.调用BeanNameAware#setBeanName方法:我的bean的名字叫做" + s);
  42. }
  43. // BeanFactoryAware 用于注入BeanFactory对象,能访问创建对象的BeanFactory。
  44. @Override
  45. public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
  46. System.out.println("4.调用BeanFactoryAware#setBeanFactory方法:注入BeanFactory对象");
  47. }
  48. // InitializingBean 接口
  49. @Override
  50. public void afterPropertiesSet() throws Exception {
  51. System.out.println("6.InitializingBean#afterPropertiesSet方法:开始初始化");
  52. }
  53. //在创建bean的时候,会走这个对应的初始化方法
  54. public void init() {
  55. System.out.println("7.自定义init方法:自定义初始化");
  56. }
  57. //销毁一个bean对象
  58. @Override
  59. public void destroy() throws Exception {
  60. System.out.println("9.DisposableBean#destroy方法:开始销毁");
  61. }
  62. public void destroyMethod() {
  63. System.out.println("10.自定义destroy方法:自定义销毁");
  64. }
  65. public void work() {
  66. System.out.println("Bean使用中~~~~");
  67. }
  68. }
5.2.1.1 代码解释

这是一个 Java 类的代码,名为 PersonBean,它实现了 Spring 框架中的几个接口:InitializingBean、BeanFactoryAware、BeanNameAware、DisposableBean。下面是这个类的详细解释:

  • PersonBean():这是 PersonBean 的构造函数,它在对象创建时被调用,并打印一条消息:「1.调用构造方法:我出生了!」。
  • getNo() 和 setNo(Integer no):这两个方法是 no 属性的 getter 和 setter,用于获取和设置对象的身份证号。
  • getName() 和 setName(String name):这两个方法是 name 属性的 getter 和 setter,用于获取和设置对象的姓名。当 name 属性被设置时,会打印一条消息:「2.设置属性:我的名字叫 xxx」。
  • setBeanName(String s):这个方法是 BeanNameAware 接口中的方法,用于设置对象的名称。当对象被创建时,Spring 容器会调用这个方法,并打印一条消息:「3.调用BeanNameAware#setBeanName方法:我的bean的名字叫做 xxx」。
  • setBeanFactory(BeanFactory beanFactory):这个方法是 BeanFactoryAware 接口中的方法,用于设置对象所在的 BeanFactory。当对象被创建时,Spring 容器会调用这个方法,并打印一条消息:「4.调用BeanFactoryAware#setBeanFactory方法:注入BeanFactory对象」。
  • afterPropertiesSet():这个方法是 InitializingBean 接口中的方法,用于在对象初始化完成后执行。当对象被创建时,Spring 容器会调用这个方法,并打印一条消息:「6.InitializingBean#afterPropertiesSet方法:开始初始化」。
  • init():这是一个自定义的初始化方法,它在对象初始化完成后被调用,并打印一条消息:「7.自定义init方法:自定义初始化」。
  • destroy():这个方法是 DisposableBean 接口中的方法,用于在对象销毁时执行。当对象被销毁时,Spring 容器会调用这个方法,并打印一条消息:「9.DisposableBean#destroy方法:开始销毁」。
  • destroyMethod():这是一个自定义的销毁方法,它在对象销毁时被调用,并打印一条消息:「10.自定义destroy方法:自定义销毁」。
  • work():这是一个自定义的方法,用于表示对象正在使用中,它会打印一条消息:「Bean使用中~~~~」。

5.2.2 定制处理器类

  1. package com.tfjy.test2;
  2. import org.springframework.beans.BeansException;
  3. import org.springframework.beans.factory.config.BeanPostProcessor;
  4. /**
  5. * @BelongsProject: demo
  6. * @BelongsPackage: com.tfjy.test2
  7. * @Author: haolizhuo
  8. * @Description: 自定义的后处理器
  9. * @CreateTime: 2023-01-29 20:54
  10. * @Version: 1.0
  11. */
  12. public class MyBeanPostProcessor implements BeanPostProcessor {
  13. //前置处理器,bean对象初始化前的动作
  14. @Override
  15. public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
  16. System.out.println("5.BeanPostProcessor.postProcessBeforeInitialization方法:bean对象初始化之前的动作");
  17. return bean;
  18. }
  19. //后置处理器,创建bean对象结束后走这里
  20. @Override
  21. public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
  22. System.out.println("8.BeanPostProcessor#postProcessAfterInitialization方法:bean对象初始化之后的动作");
  23. return bean;
  24. }
  25. }
5.2.2.1 代码解释

这段代码定义了一个自定义的Bean后处理器类 MyBeanPostProcessor 实现了 Spring 框架中的 BeanPostProcessor 接口,可以用于在 Bean 的初始化前后进行一些定制化的处理。

  • 该类实现了 postProcessBeforeInitialization 和 postProcessAfterInitialization 方法,分别用于在 Bean 初始化前和初始化后进行定制化的处理。这些方法都需要返回一个对象,表示处理后的 Bean 对象。
  • 在 postProcessBeforeInitialization 方法中,该后处理器对 Bean 进行一些初始化前的处理操作,例如对 Bean 进行属性设置、修改等。
  • 在 postProcessAfterInitialization 方法中,该后处理器对 Bean 进行一些初始化后的处理操作,例如对 Bean 进行额外的操作、修改等。
  • 这些后处理器可以在 Spring 容器启动时通过配置文件或者注解等方式指定,并会在 Bean 的创建过程中被自动调用。

5.2.3 springBean配置文件

在配置文件中通过。 init-method=“init” destroy-method=”destroyMethod”分别为personBean对象配置初始化和销毁两个生命周期。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5. <bean name="myBeanPostProcessor" class="com.tfjy.test2.MyBeanPostProcessor" />
  6. <bean name="personBean" class="com.tfjy.test2.PersonBean"
  7. init-method="init" destroy-method="destroyMethod">
  8. <property name="no" value= "80669865"/>
  9. <property name="name" value="张铁钢" />
  10. </bean>
  11. </beans>

通过springBean对象生命周期的学习,我们可以更好的了解spring里,Bean从出生到销毁的过程,并且可以利用一些操作,进行特殊处理。

六:总结&提升

此篇文章我们进行了springBean的生命周期进行了分享,并且与普通的java对象进行了对比。通过这篇文章我们能更好的认识到SpringBean 的生命周期,更好的使用好spring这个开发者的春天。

发表评论

表情:
评论列表 (有 0 条评论,137人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringBean生命周期详解

    在Spring中 Bean 可谓是一个核心的元素,当我们结合Spring进行编程的时候也离不开Bean,面对这样重要的一个角色,了解其生命周期和该生命周期所涉及的环节对我们更加