spring的bean的生命周期

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值