IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring Bean 的生命周期(看着图不迷路) -> 正文阅读

[Java知识库]Spring Bean 的生命周期(看着图不迷路)

目录

Bean的生命周期5步走系列:

BeanLifeCycle类

Spring.xml 配置文件

BeanLifeTest测试方法

运行结果:

Bean的生命周期7步走系列:在实例化Bean的前和后加了两步。????

定义myInstantiationAwareBeanPostProcessor 类

实现InstantiationAwareBeanPostProcessor 接口

并将这个类配置到Spring.xml中

复用5步走的测试方法

运行结果:

Bean的生命周期9步系列:在初始化Bean的前和后添加两步。

需要实现BeanPostProcessor接口并重写 Initialization 的两个方法

Spring.xml配置

复用5步走的测试方法

测试结果:

Bean的生命周期10步走系列:比9步多了在属性赋值之后感知

BeanLifeCycle类

复用5步走的测试方法

测试结果:

Bean的生命周期11步走系列:比10步多添加了初始化Bean之前处理的方法。

BeanLifeCycle类

复用5步走的测试方法

测试结果:

Bean的生命周期12步走系列:在销毁Bean之前添加了一步。

BeanLifeCycle类

复用5步走的测试方法

测试结果:



Bean的生命周期5步走系列:

分别是如下图:

BeanLifeCycle类

/**
 * Bean的生命周期按照粗略的五步的话:
 * 第一步:实例化Bean(调用无参数构造方法。)
 * 第二步:给Bean属性赋值(调用set方法。)
 * 第三步:初始化Bean (会调用Bean的init方法。注意:这个init方法需要自己写,自己配。)
 * 第四步:使用Bean
 * 第五步:销毁Bean (公调用Bean/destroy方法。注意:这个destroy方法需要自己写,自己配。)
 * @Author darren
 * @Date 2022/11/2 9:25
 */
public class BeanLifeCycle {

    private String name;

    public BeanLifeCycle() {
        System.out.println("第一步:实例化Bean");
    }

    public String getName() {
        return name;
    }

    public void setName(final String name) {
        System.out.println("第二步:给Bean属性赋值");
        this.name = name;
    }


    public void initMethod(){
        System.out.println("第三步:初始化Bean");
    }


    public void destroyMethod(){
        System.out.println("第五步:销毁Bean ");
    }

    @Override
    public String toString() {
        return "BeanLifeCycle{" +
                "name='" + name + '\'' +
                '}';
    }
}

Spring.xml 配置文件

  <!--Bean 的生命周期-->
    <bean id="beanLife" class="com.power.node.spring6.bean.BeanLifeCycle" init-method="initMethod"
          destroy-method="destroyMethod">
        <property name="name" value="bean_name"/>
    </bean>

BeanLifeTest测试方法

public class BeanLifeTest {
    /**
     * Bean的生命周期
     */
    @Test
    public void testBeanLifeCycle(){
        ClassPathXmlApplicationContext classPathXmlApplicationContext =
                new ClassPathXmlApplicationContext("beanLife.xml");
        BeanLifeCycle beanLife = classPathXmlApplicationContext.getBean("beanLife", BeanLifeCycle.class);
        System.out.println("第四步:使用Bean "+beanLife.toString());
        System.out.println("");

        classPathXmlApplicationContext.close();
    }
}

运行结果:

第一步:实例化Bean
第二步:给Bean属性赋值
第三步:初始化Bean
第四步:使用Bean BeanLifeCycle{name='bean_name'}
第五步:销毁Bean 

Bean的生命周期7步走系列:在实例化Bean的前和后加了两步。
????

如图:

?

定义myInstantiationAwareBeanPostProcessor 类

实现InstantiationAwareBeanPostProcessor 接口

/**
 * 实例化前后处理器
 * @Author darren
 * @Date 2022/11/2 17:16
 */
public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {

    @Override
    public Object postProcessBeforeInstantiation(final Class<?> beanClass, final String beanName)
            throws BeansException {
        System.out.println("    第1.1步-实例化之前-后期处理器");
        return InstantiationAwareBeanPostProcessor.super.postProcessBeforeInstantiation(beanClass,
                beanName);
    }

    @Override
    public boolean postProcessAfterInstantiation(final Object bean, final String beanName)
            throws BeansException {
        System.out.println("    第1.1步-实例化之后-后期处理器");
        System.out.println("");
        return InstantiationAwareBeanPostProcessor.super.postProcessAfterInstantiation(bean,
                beanName);
    }
}

并将这个类配置到Spring.xml中


    <!--Bean 的生命周期-->
    <bean id="beanLife" class="com.power.node.spring6.bean.BeanLifeCycle" init-method="initMethod"
          destroy-method="destroyMethod">
        <property name="name" value="bean_name"/>
    </bean>

    <!--实例化前后处理器-->
    <bean id="myInstantiationAwareBeanPostProcessor"
          class="com.power.node.spring6.bean.MyInstantiationAwareBeanPostProcessor"/>
</beans>

复用5步走的测试方法

运行结果:

??????????第1.1步-实例化之前-后期处理器
??? 第一步:实例化Bean
??????? ? 第1.2步-实例化之后-后期处理器
??? 第二步:Bean属性赋值
??? 第三步:初始化Bean
??? 第四步:使用Bean
??? 第五步:销毁Bean

    注意:
??? 需要实现InstantiationAwareBeanPostProcessor接口并重写Instantiation方法后并配置到xml,
??????? postProcessBeforeInstantiation:实例化之前-后期处理器
??????? postProcessAfterInstantiation :实例化之后-后期处理器

Bean的生命周期9步系列:在初始化Bean的前和后添加两步。

?

需要实现BeanPostProcessor接口并重写 Initialization 的两个方法

postProcessBeforeInitialization:初始化之前-后期处理器
postProcessAfterInitialization :初始化之后-后期处理器
/**
 * 初始化前后置处理器
 * @Author darren
 * @Date 2022/11/2 9:56
 */
public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(final Object bean, final String beanName)
            throws BeansException {
        System.out.println("    第3.1步-初始化前的-后期处理器");
        return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);

    }

    @Override
    public Object postProcessAfterInitialization(final Object bean, final String beanName)
            throws BeansException {
        System.out.println("    第3.2步-初始化后的-后期处理器");
        System.out.println("");
        return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
    }
}

Spring.xml配置

    <!--Bean 的生命周期-->
    <bean id="beanLife" class="com.power.node.spring6.bean.BeanLifeCycle" init-method="initMethod"
          destroy-method="destroyMethod">
        <property name="name" value="bean_name"/>
    </bean>

    <!--实例化前后处理器-->
    <bean id="myInstantiationAwareBeanPostProcessor"
          class="com.power.node.spring6.bean.MyInstantiationAwareBeanPostProcessor"/>

    <!--初始化前后置处理器-->
    <bean id="myBeanPostProcessor" class="com.power.node.spring6.bean.MyBeanPostProcessor"/>

复用5步走的测试方法

测试结果:

    第1.1步-实例化之前-后期处理器
第一步:实例化Bean
    第1.1步-实例化之后-后期处理器

第二步:给Bean属性赋值
    
    第3.1步-初始化前的-后期处理器   
第三步:初始化Bean
    第3.2步-初始化后的-后期处理器

第四步:使用Bean BeanLifeCycle{name='bean_name'}
第五步:销毁Bean 

Bean的生命周期10步走系列:比9步多了在属性赋值之后感知

如图:

BeanLifeCycle类

需要这个类实现Aware(感知)接口,
    如:BeanNameAware、BeanClassLoaderAware、BeanFactoryAware、ApplicationContextAware
在属性赋值之后感知可以获取或设置下面信息
    BeanName、BeanClassLoader、BeanFactory、ApplicationContext
public class BeanLifeCycle implements BeanNameAware, BeanFactoryAware, BeanClassLoaderAware,
        ApplicationContextAware {

    private String name;

    public BeanLifeCycle() {
        System.out.println("第一步:实例化Bean");
    }

    public String getName() {
        return name;
    }

    public void setName(final String name) {
        System.out.println("第二步:给Bean属性赋值");
        this.name = name;
    }

    @Override
    public void setBeanName(final String s) {
        System.out.println("    第2.2步-属性感知-设置属性名称:"+s);
    }

    @Override
    public void setBeanClassLoader(final ClassLoader classLoader) {
        System.out.println("    第2.3步-属性感知-设置类加载器:"+classLoader);
    }

    @Override
    public void setBeanFactory(final BeanFactory beanFactory) throws BeansException {
        System.out.println("    第2.4步-属性感知-设置bean工厂:"+beanFactory);
    }

    @Override
    public void setApplicationContext(final ApplicationContext applicationContext)
            throws BeansException {
        System.out.println("    第2.5步-属性感知-设置上下文:"+applicationContext);
        System.out.println("");
    }


    public void initMethod(){
        System.out.println("第三步:初始化Bean");
    }


    public void destroyMethod(){
        System.out.println("第五步:销毁Bean ");
    }

    @Override
    public String toString() {
        return "BeanLifeCycle{" +
                "name='" + name + '\'' +
                '}';
    }
}

复用5步走的测试方法

测试结果:

    第1.1步-实例化之前-后期处理器
第一步:实例化Bean
    第1.1步-实例化之后-后期处理器

第二步:给Bean属性赋值
    第2.2步-属性感知-设置属性名称:beanLife
    第2.3步-属性感知-设置类加载器:jdk.internal.loader.ClassLoaders$AppClassLoader@78308db1
    第2.4步-属性感知-设置bean工厂:org.springframework.beans.factory.support.DefaultListableBeanFactory@5812f68b: defining beans [beanLife,myInstantiationAwareBeanPostProcessor,myBeanPostProcessor]; root of factory hierarchy
    第2.5步-属性感知-设置上下文:org.springframework.context.support.ClassPathXmlApplicationContext@29f7cefd, started on Wed Nov 02 21:11:42 CST 2022

    第3.1步-初始化前的-后期处理器
第三步:初始化Bean
    第3.2步-初始化后的-后期处理器

第四步:使用Bean BeanLifeCycle{name='bean_name'}
第五步:销毁Bean 

Bean的生命周期11步走系列:比10步多添加了初始化Bean之前处理的方法。

如图:

BeanLifeCycle类

需要这个类实现InitializingBean接口,重写afterPropertiesSet方法
public class BeanLifeCycle implements BeanNameAware, BeanFactoryAware, BeanClassLoaderAware,
        ApplicationContextAware, InitializingBean {

    private String name;

    public BeanLifeCycle() {
        System.out.println("第一步:实例化Bean");
    }

    public String getName() {
        return name;
    }

    public void setName(final String name) {
        System.out.println("第二步:给Bean属性赋值");
        this.name = name;
    }

    @Override
    public void setBeanName(final String s) {
        System.out.println("    第2.2步-属性感知-设置属性名称:"+s);
    }

    @Override
    public void setBeanClassLoader(final ClassLoader classLoader) {
        System.out.println("    第2.3步-属性感知-设置类加载器:"+classLoader);
    }

    @Override
    public void setBeanFactory(final BeanFactory beanFactory) throws BeansException {
        System.out.println("    第2.4步-属性感知-设置bean工厂:"+beanFactory);
    }

    @Override
    public void setApplicationContext(final ApplicationContext applicationContext)
            throws BeansException {
        System.out.println("    第2.5步-属性感知-设置上下文:"+applicationContext);
        System.out.println("");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("        第3.1.1步-初始化之前调用");
    }

    public void initMethod(){
        System.out.println("第三步:初始化Bean");
    }


    public void destroyMethod(){
        System.out.println("第五步:销毁Bean ");
    }

    @Override
    public String toString() {
        return "BeanLifeCycle{" +
                "name='" + name + '\'' +
                '}';
    }
}

复用5步走的测试方法

测试结果:

    第1.1步-实例化之前-后期处理器
第一步:实例化Bean
    第1.1步-实例化之后-后期处理器

第二步:给Bean属性赋值
    第2.2步-属性感知-设置属性名称:beanLife
    第2.3步-属性感知-设置类加载器:jdk.internal.loader.ClassLoaders$AppClassLoader@78308db1
    第2.4步-属性感知-设置bean工厂:org.springframework.beans.factory.support.DefaultListableBeanFactory@5812f68b: defining beans [beanLife,myInstantiationAwareBeanPostProcessor,myBeanPostProcessor]; root of factory hierarchy
    第2.5步-属性感知-设置上下文:org.springframework.context.support.ClassPathXmlApplicationContext@29f7cefd, started on Wed Nov 02 21:11:42 CST 2022

    第3.1步-初始化前的-后期处理器
        第3.1.1步-初始化之前调用
第三步:初始化Bean
    第3.2步-初始化后的-后期处理器

第四步:使用Bean BeanLifeCycle{name='bean_name'}
第五步:销毁Bean 

Bean的生命周期12步走系列:在销毁Bean之前添加了一步。

如图:

?

BeanLifeCycle类

需要这个类实现DisposableBean接口,并重写destroy方法,调用时机是在指定destroy-method 之前调用
public class BeanLifeCycle implements BeanNameAware, BeanFactoryAware, BeanClassLoaderAware,
        ApplicationContextAware, InitializingBean, DisposableBean {

    private String name;

    public BeanLifeCycle() {
        System.out.println("第一步:实例化Bean");
    }

    public String getName() {
        return name;
    }

    public void setName(final String name) {
        System.out.println("第二步:给Bean属性赋值");
        this.name = name;
    }

    @Override
    public void setBeanName(final String s) {
        System.out.println("    第2.2步-属性感知-设置属性名称:"+s);
    }

    @Override
    public void setBeanClassLoader(final ClassLoader classLoader) {
        System.out.println("    第2.3步-属性感知-设置类加载器:"+classLoader);
    }

    @Override
    public void setBeanFactory(final BeanFactory beanFactory) throws BeansException {
        System.out.println("    第2.4步-属性感知-设置bean工厂:"+beanFactory);
    }

    @Override
    public void setApplicationContext(final ApplicationContext applicationContext)
            throws BeansException {
        System.out.println("    第2.5步-属性感知-设置上下文:"+applicationContext);
        System.out.println("");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("        第3.1.1步-初始化之前调用");
    }

    public void initMethod(){
        System.out.println("第三步:初始化Bean");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("    第5.1步-销毁-在destroy-method 之前调用");
    }

    public void destroyMethod(){
        System.out.println("第五步:销毁Bean ");
    }

    @Override
    public String toString() {
        return "BeanLifeCycle{" +
                "name='" + name + '\'' +
                '}';
    }
}

复用5步走的测试方法

测试结果:

    第1.1步-实例化之前-后期处理器
第一步:实例化Bean
    第1.1步-实例化之后-后期处理器

第二步:给Bean属性赋值
    第2.2步-属性感知-设置属性名称:beanLife
    第2.3步-属性感知-设置类加载器:jdk.internal.loader.ClassLoaders$AppClassLoader@78308db1
    第2.4步-属性感知-设置bean工厂:org.springframework.beans.factory.support.DefaultListableBeanFactory@5812f68b: defining beans [beanLife,myInstantiationAwareBeanPostProcessor,myBeanPostProcessor]; root of factory hierarchy
    第2.5步-属性感知-设置上下文:org.springframework.context.support.ClassPathXmlApplicationContext@29f7cefd, started on Wed Nov 02 21:11:42 CST 2022

    第3.1步-初始化前的-后期处理器
        第3.1.1步-初始化之前调用
第三步:初始化Bean
    第3.2步-初始化后的-后期处理器

第四步:使用Bean BeanLifeCycle{name='bean_name'}

    第5.1步-销毁-在destroy-method 之前调用
第五步:销毁Bean

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-11-05 00:12:25  更:2022-11-05 00:17:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 -2025/3/10 19:38:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码