SpringIOC容器中Bean的生命周期解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HSH205572/article/details/86580186

未添加Bean的后置处理器处理的Bean的生命周期如下:

SpringIOC容器对Bean的生命周期的管理过程:

1、通过构造器或工厂方法创建Bean的实例

2、为Bean的属性赋值或对其他Bean的引用

3、调用Bean的初始化方法

4、使用Bean

5、当容器关闭时,调用Bean的销毁方法

在Bean的声明中设置init-method和destroy-method属性,为Bean指定初始化和销毁方法。

测试demo:

package com.demoinfo.common.model;

import org.apache.commons.lang3.builder.ToStringBuilder;

import java.io.Serializable;

/**
 * 描述 测试类
 *
 * @author ***
 * @date 2019/1/21 16:26
 */
public class TestModule implements Serializable {

    private String name;
    private String phone;

    public TestModule() {
        System.out.println("***构造器***");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("***注入属性值***");
        this.name = name;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    void init() {
        System.out.println("***bean初始化方法加载***");
    }

    void destroy() {
        System.out.println("***bean销毁方法加载***");
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this)
                .append("name", name)
                .append("phone", phone)
                .toString();
    }
}

<!--测试bean-->
<bean id="testModule" class="com.demoinfo.common.model.TestModule"
      init-method="init" destroy-method="destroy">
    <property name="name" value="hello"/>
    <property name="phone" value="15328552325"/>
</bean>

测试结果:

***构造器***
***注入属性值***
***注入属性值***
***bean初始化方法加载***
 

添加Bean的后置处理器处理的Bean的生命周期

- Bean的后置处理器允许在调用初始化方法前后对Bean进行额外的处理。

- Bean的后置处器对IOC容器的所有Bean是逐一处理,而非单一实例

- Bean的后置处理器需要实现BeanPostProcessor接口。

使用后置处理器SpringIOC容器对Bean的生命周期进行管理:

1、使用构造器或工厂方法创建Bean实例

2、为Bean的属性设置值或对其他Bean的引用

3、将Bean的实例传递给Bean的后置处理器的postProcessBeforeInitialization方法

4、调用Bean的初始化方法

5、将Bean的实例传递给Bean的后置处理器的PostProcessAfterInitialization方法

6、使用Bean

7、当容器关闭时,调用Bean的销毁方法

测试demo如下:

package com.demoinfo;

import com.demoinfo.common.model.TestModule;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

/**
 * 描述
 *
 * @author ***
 * @date 2019/1/21 15:44
 */
public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("*******" + bean.toString() + "=========>" + beanName);
        if (bean instanceof TestModule) {
            TestModule tm = (TestModule) bean;
            //改变bean的一个属性值
            tm.setName("helloWorld");
        }

        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("*******" + bean.toString() + "=========>" + beanName);
        return bean;
    }
}

<!--配置后置处理器-->
<bean class="com.demoinfo.MyBeanPostProcessor"/>

测试结果如下:

***构造器***
***注入属性值***
*******com.demoinfo.common.model.TestModule@7fd8c559[name=hello,phone=15328552325]=========>testModule
***注入属性值***
***bean初始化方法加载***
*******com.demoinfo.common.model.TestModule@7fd8c559[name=helloWorld,phone=15328552325]=========>testModule

***bean销毁方法加载***
2019-01-21 17:36:45,902 [main] INFO  com.alibaba.druid.pool.DruidDataSource - {dataSource-1} closed

猜你喜欢

转载自blog.csdn.net/HSH205572/article/details/86580186