实用 | Spring容器中Bean的生命周期

 Bean的作用域

类别                                           说明

singleton

在SpringIOC容器中仅存在一个Bean实例,Bean以单实例的方式存在

prototype

每次调用getBean()时都会返回一个新的实例

request

每次HTTP请求都会创建一个新的Bean,该作用域仅适用于

WebApplicationContext环境

session

同一个HTTP Session共享一个Bean,不同的HTTP Session使用不同的

Bean。该作用域仅适用于WebApplicationContext环境

 

Spring初始化bean或销毁bean时,有时需要作一些处理工作,因此spring可以在创

建和拆卸bean的时候调用bean的两个生命周期方法。

 

<bean id=“xxx” class=“...Yoo”
init-method=“init”
destory-method=“destroy”/>

当bean被载入到容器的时候调用init

当bean从容器中删除的时候调用 destroy(scope= singleton有效)

web容器中会自动调用,但是main函数或测试用例需要手动调用

 

Spring容器中Bean的生命周期

1. instantiate bean对象实例化

2. populate properties 封装属性

3. 如果Bean实现BeanNameAware 执行 setBeanName

4. 如果Bean实现BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象 setApplicationContext

5. 如果存在类实现 BeanPostProcessor(后处理Bean) ,执行 postProcessBeforeInitialization

6. 如果Bean实现InitializingBean 执行 afterPropertiesSet

7. 调用<bean init-method="init"> 指定初始化方法 init如果存在类实现 BeanPostProcessor(处理Bean) ,执行postProcessAfterInitialization

8. 执行业务处理

9. 如果Bean实现 DisposableBean 执行 destroy

10. 调用<bean destroy-method="customerDestroy"> 指定销毁方法 customerDestroy

 

代码实现:

Man实体类

public class Man implements BeanNameAware, ApplicationContextAware, InitializingBean, DisposableBean {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("第二步:设置属性");
        this.name = name;
    }

    public Man() {
        System.out.println("第一步:Man被实例化了");
    }

    public void setup(){
        System.out.println("第七步:Man被初始化了");
    }

    public void teardown(){
        System.out.println("第十一步:Man被销毁了");
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("第三步:设置Bean的名称"+name);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("第四步:了解工厂信息");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("第六步:属性设置后");
    }


    public void run(){
        System.out.println("第九步:执行业务方法");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("第十步:执行Spring的销毁方法");
    }
}

 

MyBeanPostProcessor

public class MyBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("第五步:初始化前方法..");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("第八步:初始化后方法..");
        if("userDao".equals(beanName)){
            Object proxy = Proxy.newProxyInstance(bean.getClass().getClassLoader(), bean.getClass().getInterfaces(), new InvocationHandler() {
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                   if ("save".equals(method.getName())){
                       System.out.println("权限校验=========");
                       return method.invoke(bean,args);
                   }
                    return method.invoke(bean,args);
                }
            });
            return proxy;
        }else {
            return bean;
        }
    }
}

ApplicationContext.xml

<bean id="man" class="demo3.Man" init-method="setup" destroy-method="teardown">
  <property name="name" value="张三"></property>
</bean>

<bean class="demo3.MyBeanPostProcessor"/>

测试类:

public class SpringDemo3 {
 @Test
    public  void test2(){
        ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");

        Man man = (Man) applicationContext.getBean("man");

        man.run();

        applicationContext.close();
    }
}

执行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值