珊珊老师 的笔记

做最负责任的教育~我是执行者珊珊

2024-11-13 16:51

深入理解 Java Bean 的生命周期及各个阶段解析

珊珊老师

JavaEE

(42)

(0)

收藏

一、什么是Java Bean

    Java Bean是一个符合特定规范的Java类,通常具有私有的成员变量、公共的getter和setter方法,以及一个无参构造函数。这些特性使得Bean对象易于序列化和反序列化,并且被广泛应用于Java开发中,尤其在框架和应用程序中经常被用作数据封装和组件复用。


二、Bean的生命周期概述

    Java Bean的生命周期从创建到销毁可以分为以下五个关键阶段:

    创建阶段(实例化 Bean):当使用构造函数或者工厂方法创建Bean对象时,就进入了创建阶段。

    属性设置阶段:在Bean对象创建后,通过setter方法设置Bean的各个属性。

    初始化阶段:当Bean的属性设置完成后,会触发初始化回调方法,进行一些额外的初始化工作。

    实现了各种 Aware 通知的⽅法,如 BeanNameAware、BeanFactoryAware、

    ApplicationContextAware 的接⼝⽅法

    执⾏ BeanPostProcessor 初始化前置⽅法

    执⾏ @PostConstruct 初始化⽅法,依赖注⼊操作之后被执⾏

    执⾏⾃⼰指定的 init-method ⽅法

    执⾏ BeanPostProcessor 初始化后置⽅法

    使用阶段:在初始化完成后,Bean对象处于可用状态,可以供应用程序使用。

    销毁阶段:当Bean对象不再需要时,会触发销毁回调方法,进行资源释放等清理工作,销毁容器的各种⽅法,如 @PreDestroy、DisposableBean 接⼝⽅法、destroy-method

    流程如下图:

image.png

三、Bean的创建阶段

    在Bean的创建阶段,可以通过构造函数或者工厂方法来创建Bean对象。构造函数用于创建对象的实例,而工厂方法则通过调用静态方法来获取Bean的实例。在创建阶段,还可以利用依赖注入(DI)等技术,将依赖的对象传递给Bean。

// 示例1:使用构造函数创建Bean对象
public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // getter和setter方法省略
}

// 示例2:使用工厂方法创建Bean对象
public class BeanFactory {
    public static Person createPerson(String name, int age) {
        return new Person(name, age);
    }
}

四、属性设置阶段

       在创建Bean对象后,我们通常会通过setter方法来设置Bean的各个属性。这些属性可以是基本数据类型、引用类型,甚至是其他的Bean对象。属性设置阶段是为了确保Bean对象在初始化之前具备正确的状态。

// 示例:设置Bean的属性
Person person = new Person();
person.setName("John Doe");
person.setAge(30);

五、使用阶段

    初始化完成后,Bean对象处于可用状态,可以供应用程序使用。在使用阶段,Bean可能会被注入到其他组件中,执行业务逻辑等。

public class UserService {
    private UserDao userDao;

    // 通过依赖注入注入UserDao对象
     @Autowired
    public UserService(UserDao userDao) {
        this.userDao = userDao;
    }

    // 执行业务逻辑,使用userDao对象
    // ...
}

六、销毁阶段

    当Bean对象不再需要时,会触发销毁回调方法。在Java中,我们可以使用@PreDestroy注解或者实现DisposableBean接口来指定销毁回调方法。在销毁阶段,可以进行一些资源释放和清理工作,如关闭数据库连接、释放文件资源等。

public class MyBean {
    @PreDestroy
    public void destroy() {
        // 执行销毁操作,例如关闭数据库连接等
    }
}


0条评论

点击登录参与评论