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 的生命周期的更多相关文章

  1. (spring-第1回【IoC基础篇】)Spring容器中Bean的生命周期

    日出日落,春去秋来,花随流水,北雁南飞,世间万物皆有生死轮回.从调用XML中的Bean配置信息,到应用到具体实例中,再到销毁,Bean也有属于它的生命周期. 人类大脑对图像的认知能力永远高于文字,因此 ...

  2. Spring容器中bean的生命周期以及关注spring bean对象的后置处理器:BeanPostProcessor(一个接口)

    Spring IOC 容器对 Bean 的生命周期进行管理的过程: 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.将 Bean 实例传递给 ...

  3. IoC基础篇(一)--- Spring容器中Bean的生命周期

    日出日落,春去秋来,花随流水,北雁南飞,世间万物皆有生死轮回.从调用XML中的Bean配置信息,到应用到具体实例中,再到销毁,Bean也有属于它的生命周期. 人类大脑对图像的认知能力永远高于文字,因此 ...

  4. Spring容器中Bean的生命周期

  5. Spring(十二):IOC容器中Bean的生命周期方法

    IOC容器中Bean的生命周期方法 1)Spring IOC容器可以管理Bean的声明周期,Spring允许在Bean生命周期的特定点执行定制的任务. 2)Spring IOC容器对Bean的生命周期 ...

  6. 7 -- Spring的基本用法 -- 9...容器中Bean的生命周期

    7.9 容器中Bean的生命周期 Spring可以管理singleton作用域的Bean的生命周期,Spring可以精确地知道该Bean何时被创建,何时被初始化完成.容器何时准备销毁该Bean实例. ...

  7. spring IOC 容器中 Bean 的生命周期

    IOC 容器中 Bean 的生命周期: 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.调用 Bean 后置处理器接口(BeanPostPr ...

  8. Spring IOC容器中Bean的生命周期

    1.IOC容器中Bean的生命周期 构造器函数 设置属性 初始化函数(在Bean配置中 init-method) 使用Bean 结束时关闭容器(在Bean中配置destroy-method) 2.Be ...

  9. Spring学习-- IOC 容器中 bean 的生命周期

    Spring IOC 容器可以管理 bean 的生命周期 , Spring 允许在 bean 声明周期的特定点执行定制的任务. Spring IOC 容器对 bean 的生命周期进行管理的过程: 通过 ...

随机推荐

  1. 预处理、const、static与sizeof-用#define实现宏并求最大值和最小值

    1:实现代码: #define MAX(x,y) (((x)>(y)) ? (x):(y)) #define MIN(x,y) (((x)>(y)) ? (x):(y)) 需要注意的几点: ...

  2. Leetcode题目39.组合总和(回溯+剪枝-中等)

    题目描述: 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无 ...

  3. Difference between C# compiler version and language version

    Difference between C# compiler version and language version     As nobody gives a good enough answer ...

  4. Docker镜像搭建ubuntu下samba目录共享

    第一种方法:(未使用) yum install docker // 下载镜像 docker pull dperson/samba // 启动镜像,具体看文档,但重要的配置是以下的注释 docker r ...

  5. python安装gmpy2模块时出现错误的解决

    接下来表演的是安装Python模块gmpy2 此模块用来进行高精度计算的模块,个人根据需求常用来进行rsa加密算法的计算 作为一个资质浅淡的ubuntu玩家,这些知识当然是在网上搜索得到的,不过网上的 ...

  6. 模型压缩-Learning Efficient Convolutional Networks through Network Slimming

    Zhuang Liu主页:https://liuzhuang13.github.io/ Learning Efficient Convolutional Networks through Networ ...

  7. ng build --aot 与 ng build --prod

    angluar的编译有以下几种方式: ng build  常规的压缩操作    代码体积最大 ng build --aot   angular预编译      代码体积较小 ng build --pr ...

  8. 微信小程序开发-框架

    小程序开发框架的目标是通过尽可能简单.高效的方式让开发者可以在微信中开发具有原生 APP 体验的服务.框架提供了自己的视图层描述语言 WXML 和 WXSS,以及基于 JavaScript 的逻辑层框 ...

  9. Spring Boot启动的报错 Stopping service [Tomcat]

    我遇到的问题是项目中使用java_websocket的WebSocketClient,由于性能要求,需要再Controller直接继承WebSocketClient, 在项目启动过程中调试进入spri ...

  10. Linux服务器端使用tcpdump抓redis报文

    yum update yum install tcpdump tcpdump host -i ens192 -w /tmp/redis-zsetcapture.cap 其中ens192是网卡名, /t ...