Spring之bean生命始末

可以为Bean定制初始化后的生命行为,也可以为Bean定制销毁前的生命行为。
举例:ba06包。
首先,这些方法需要在Bean类中事先定义好:是方法名随意的public void方法。

其次,在配置文件的<bean/>标签中增加如下属性:
init-method:指定初始化方法的方法名
destroy-method:指定销毁方法的方法名

注意,若要看到Bean的destroy-method的执行结果,需要满足两个条件:
(1)Bean为singleton,即单例
(2)要确保容器关闭。接口ApplicationContext没有close()方法,但其实现类有。所以,可以将ApplicationContext强转为其实现类对象,或直接创建的就是实现类对象。

Bean的生命周期
Bean实例从创建到最后销毁,需要经过很多过程,执行很多生命周期方法。
Step1:调用无参构造器,创建实例对象。
Step2:调用参数的setter,为属性注入值。

Step3:若Bean实现了BeanNameAware接口,则会执行接口方法setBeanName(String beanId),使Bean类可以获取其在容器中的id名称。
Step4:若Bean实现了BeanFactoryAware接口,则执行接口方法setBeanFactory(BeanFactory factory),使Bean类可以获取到BeanFactory对象。
Step5:若定义并注册了Bean后处理器BeanPostProcessor,则执行接口方法postProcessBeforeInitialization()。
Step6:若Bean实现了InitializingBean 接口,则执行接口方法afterPropertiesSet ()。该方法在Bean的所有属性的set方法执行完毕后执行,是Bean初始化结束的标志,即Bean实例化结束。
Step7:若设置了init-method方法,则执行。
Step8:若定义并注册了Bean后处理器BeanPostProcessor,则执行接口方法postProcessAfterInitialization()。
Step9:执行业务方法。
Step10:若Bean实现了DisposableBean接口,则执行接口方法destroy()。
Step11:若设置了destroy-method方法,则执行。

<bean/>标签的id属性与name属性
一般情况下,命名<bean/>使用id属性,而不使用name属性。在没有id属性的情况下,name属性与id属性作用是相同的。但,当<bean/>中含有一些特殊字符时,就需要使用name属性了。
id的命名需要满足XML对ID属性命名规范:必须以字母开头,可以包含字母、数字、下划线、连字符、句话、冒号。且要求名称在容器中必须唯一。
name则可以包含各种字符,且对名称没有唯一性要求。若名称不唯一,则后面的会覆盖前面的。

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;

public class ISomeServiceImpl  implements ISomeService,BeanNameAware,BeanFactoryAware,InitializingBean,DisposableBean{

    private String adao;

    public void setAdao(String adao) {
        this.adao = adao;
        System.out.println("step2:setter方法");
    }

    ISomeServiceImpl(){
        System.out.println("step1:构造方法");
    }

    @Override
    public String doFirst() {
        System.out.println("step9:主方法体doFirst()=============");
        return "abcde";
    }

    @Override
    public void doSecond() {
//        System.out.println("=============doSecond()=============");
    }

    public void initAfter(){
        System.out.println("step7:initAfter()初始化之后=============");
    }

    public void preDestroy(){
        System.out.println("step11:preDestroy()销毁之前=============");
    }

    @Override
    public void setBeanName(String s) {
        System.out.println("step3:beanName=" +s );
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("step4:beanFactory"+beanFactory);
    }

//    方法标识着bean的初始化工作已经完毕
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("step6:bean的初始化工作已经完毕");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("step10:准备开始执行销毁流程");
    }
}
原文地址:https://www.cnblogs.com/wangbin2188/p/9014224.html