spring的bean的生命周期

来源:互联网 发布:淘宝软妹服装店铺 编辑:程序博客网 时间:2024/06/15 02:47

Spring的bean生命周期分为11步

1、初始化bean,调用构造函数,创建bean实例
2、对其bean的属性进行注入赋值
3、如果bean实现BeanNameAware接口,执行setBeanName方法
4、如果bean实现BeanFactoryAware或ApplicationContextAware接口,将会执行setBeanFactory方法,可以获取到上下文对象BeanFactory
5、如果有其他类实现了BeanPostProcessor接口,将会执行postProcessBeforeInitialization方法
6、如果bean实现InitializingBean接口,将执行afterPropertiesSet方法
7、我们可以自定义一个bean类的初始化方法,例如:initBean方法,这个需要在配置文件中设置,才能执行
8、这一步跟第五步是同一个类,也就是其他类实现了BeanPostProcessor接口,但它将会执行postProcessAfterInitialization方法
9、这是执行的我们自己将要执行的业务方法,这里举例使用show方法
10、如果bean实现DisposableBean接口,将会执行destroy方法
11、可以自定义一个bean类的销毁方法,例如:destroyBean方法,这个需要在配置文件中设置,才能执行

第五步和第八步可以对bean进行功能增强,一般会使用动态代理技术,也是spring的AOP(面向切面)编程的方式

上面列举了具体的11步,下面使用一个例子列举

这是bean类
LifeCycleBean.java

package cn.ioc.lifecycle;import org.springframework.beans.BeansException;import org.springframework.beans.factory.BeanFactory;import org.springframework.beans.factory.BeanFactoryAware;import org.springframework.beans.factory.BeanNameAware;import org.springframework.beans.factory.DisposableBean;import org.springframework.beans.factory.InitializingBean;public class LifeCycleBean implements BeanNameAware,BeanFactoryAware,InitializingBean,DisposableBean{    private String info;    public LifeCycleBean() {        super();        System.out.println("第一步:使用无参构造实例化对象");    }    public void setInfo(String info) {        System.out.println("第二步:info属性封装");        this.info = info;    }    public void show(){        System.out.println("第九步:这是我自己定义的一个方法,执行我的业务"+info);    }    @Override    public void setBeanName(String name) {        System.out.println("第三步:获取BeanName的名字--"+name);    }    @Override    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {        System.out.println("第四步:获取到BeanFactory对象"+beanFactory);    }    @Override    public void afterPropertiesSet() throws Exception {        System.out.println("第六步:Spring自带的Bean初始化");    }    public void initBean(){        System.out.println("第七步:这是我自己定义的一个Bean初始化");    }    @Override    public void destroy() throws Exception {        System.out.println("第十步:这是Spring自带的Bean清除");    }    public void destroyBean(){        System.out.println("第十一步:这是我自己定义的一个Bean清除");    }}

这个一个实现了BeanPostProcessor接口的类
ProxyBean.java

package cn.ioc.lifecycle;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;public class ProxyBean implements BeanPostProcessor{    @Override    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {        System.out.println("第五步:代理类的初始化Bean"+"  "+bean+"   执行的类名:"+beanName);        return bean;    }    @Override    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {        System.out.println("第八步:代理类的后处理Bean"+"  "+bean+"   执行的类名:"+beanName);        return bean;    }}

配置文件:
applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">    <!-- 指定实现了BeanPostProcessor接口的类 -->    <bean class="cn.ioc.lifecycle.ProxyBean"></bean>    <!-- init-method:指定自定义初始化方法名称         destroy-method:指定自定义销毁方法名称     -->    <bean name="LifeCycleBeanTest" class="cn.ioc.lifecycle.LifeCycleBean" init-method="initBean" destroy-method="destroyBean">        <!-- 为bean类的属性赋值 -->        <property name="info" value="spring生命周期展示"></property>    </bean></beans>

测试类
LifeCycleTest.java

package cn.ioc.test;import org.junit.Test;import org.springframework.context.support.ClassPathXmlApplicationContext;import cn.ioc.lifecycle.LifeCycleBean;public class LifeCycleTest {    @Test    public void test1(){        //读取配置文件        ClassPathXmlApplicationContext  applicationContex = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");        //获取bean对象        LifeCycleBean bean = (LifeCycleBean) applicationContex.getBean("LifeCycleBeanTest");        //自定义方法执行        bean.show();        //关闭时,bean对象销毁        applicationContex.close();    }}

测试结果:

第一步:使用无参构造实例化对象第二步:info属性封装第三步:获取BeanName的名字--LifeCycleBeanTest第四步:获取到BeanFactory对象org.springframework.beans.factory.support.DefaultListableBeanFactory@544fe44c: defining beans [cn.ioc.lifecycle.ProxyBean#0,LifeCycleBeanTest]; root of factory hierarchy第五步:代理类的初始化Bean  cn.ioc.lifecycle.LifeCycleBean@4eb7f003   执行的类名:LifeCycleBeanTest第六步:Spring自带的Bean初始化第七步:这是我自己定义的一个Bean初始化第八步:代理类的后处理Bean  cn.ioc.lifecycle.LifeCycleBean@4eb7f003   执行的类名:LifeCycleBeanTest第九步:这是我自己定义的一个方法,执行我的业务spring生命周期展示第十步:这是Spring自带的Bean清除第十一步:这是我自己定义的一个Bean清除
0 0