首页 > 编程语言 > 详细

Spring 容器中 Bean 的生命周期

时间:2019-06-15 17:21:37      阅读:97      评论:0      收藏:0      [点我收藏+]

Spring 容器中 Bean 的生命周期

1. init-method 和 destory-method 方法

Spring 初始化 bean 或销毁 bean 时,有时需要作一些处理工作,因此 spring 可以在创建和拆卸 bean 的时候调用 bean 的两个生命周期方法。

如:

bean id="xxx" class="xxx" init-method="init" destory-method="destory" />
  • 当 bean 被载入到容器的时候调用 init,当 bean 从容器中删除的时候调用 destory(scope=singleton有效)。init 和 destory 的方法名可以自己命名

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

具体代码:SpringDemo3.demo2()


2. Spring 容器中 Bean 的生命周期(了解)

技术分享图片

  1. instantiate bean 对象实例化
  2. populate properties 封装属性
  3. 如果 Bean 实现 BeanNameAware 执行 setBeanName
  4. 如果 Bean 实现 BeanFacotryAware 或者 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

其中最重要的是:第五步和第七步。

在 ide 中实现上述过程,打印如下:

技术分享图片

具体代码:SpringDemo3.demo3()


3. beanpostprocessor 的作用

beanpostprocessor 类可以在生成类的过程当中,对类产生代理,并可以对类中的方法进行增强。

如下面代码就是一个 beanpostprocessor 类,我们对 postProcessAfterInitialization 初始化后方法进行增强。增强 bean 中的 save 方法。

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

    @Override
    public Object postProcessAfterInitialization(final 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;
        }
    }
}

输出如下:

技术分享图片

具体代码:SpringDemo3.demo4()

Spring 容器中 Bean 的生命周期

原文:https://www.cnblogs.com/weixuqin/p/11027841.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!