Spring基础14——Bean的生命周期
1.IOC容器中的Bean的生命周期方法
SpringIOC容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务。SpringIOC容器对Bean的生命周期进行管理的过程:
1)通过构造器或工厂方法创建Bean实例
2)为bean的属性设置值和对其他bean的引用
3)调用Bean的初始化方法
4)Bean可以使用了
5)当容器关闭时,调用Bean的销毁方法
2.验证bean的生命周期
我们可以在Spring的配置文件中声明init-method属性和destory-method属性为Bean指定初始化和销毁方法。
首先我们先创建一个Car类:
public class Car {
public Car() {
System.out.println("Car's Constructor");
}
private String brand;
public void setBrand(String brand) {
System.out.println("setBrand...");
this.brand = brand;
}
//初始化方法
public void init() {
System.out.println("init....");
}
//销毁方法
public void destory() {
System.out.println("destory.....");
}
@Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
'}';
}
}
Spring配置文件
<bean id="car" class="com.wzy.cycle.Car" init-method="init" destroy-method="destory">
<property name="brand" value="Audi"/>
</bean>
编写一个测试类对id为car的bean进行获取
public class Main {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans-cycle.xml");
Car car = (Car) ctx.getBean("car");
System.out.println(car);
ctx.close();
}
}
输出结果:

3.创建Bean后置处理器
Bean后置处理器允许在调用初始化方法前后对Bean进行额外的处理。Bean后置处理器对IOC容器里所有Bean实例逐一处理,而非单一实例。其典型的应用就是:检查Bean属性的正确性或根据特定的标准更改bean的属性。对Bean后置处理器而言,需要实现BeanPostProcessor接口,在初始化方法被调用前后,Spring将每个Bean实例分别传递给上述接口的以下两个方法。
在BeanPostProcessor接口中包含两个方法,postProcessBeforeInitialization()和postProcessAfterInitialization():
1)postProcessBeforeInitialization(Object bean, String beanName):init-method之前被调用
2)postProcessAfterInitialization(Object bean, String beanName):init-method之后被调用
创建Bean后置处理器,首先先创建一个类并实现BeanPostProcessor接口,并实现上面两个方法:
public class MyBeanPostProcessor implements BeanPostProcessor{
@Nullable
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization " + bean + ", " + beanName);
if ("car".equals(beanName)) {
//do sth
}
return bean;
}
@Nullable
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization " + bean + ", " + beanName);
Car car = new Car();
car.setBrand("FuTe");
return car;
}
}
在spring.xml配置bean后置处理器:
<!--实现BeanProcessor接口,并具体提供
postProcessBeforeInitialization(Object bean, String beanName):init-method之前被调用
postProcessAfterInitialization(Object bean, String beanName):init-method之后被调用
的实现
bean:bean本身
beanName:IOC容器配置的bean的名字
返回值:是实际上返回给用户的那个bean,注意:可以在以上两个方法中修改返回的bean,甚至甚至返回一个新的bean
-->
<!--配置bean的后置处理器:不需要配置id,IOC容器会自动识别是一个BeanPostProcessor-->
<bean id="myBeanPostProcessor" class="com.wzy.cycle.MyBeanPostProcessor"/>
再次运行测试类,查看输出结果:

4.添加Bean的后置处理器后Bean的生命周期
1)通过构造器或工厂方法创建bean实例
2)为bean的属性设置值和对其他bean的引用
3)将Bean实例传递给Bean后置处理器
4)执行postProcessBeforeInitialization方法
5)调用bean的init方法
6)将Bean实例传递给Bean后置处理器
7)执行postProcessAfterInitialization方法
8)bean可以使用了
9)当容器关闭了调用bean销毁方法
Spring基础14——Bean的生命周期的更多相关文章
- (转)Spring管理的Bean的生命周期
http://blog.csdn.net/yerenyuan_pku/article/details/52834011 bean的初始化时机 前面讲解了Spring容器管理的bean的作用域.接着我们 ...
- Spring 容器中 Bean 的生命周期
Spring 容器中 Bean 的生命周期 1. init-method 和 destory-method 方法 Spring 初始化 bean 或销毁 bean 时,有时需要作一些处理工作,因此 s ...
- (spring-第1回【IoC基础篇】)Spring容器中Bean的生命周期
日出日落,春去秋来,花随流水,北雁南飞,世间万物皆有生死轮回.从调用XML中的Bean配置信息,到应用到具体实例中,再到销毁,Bean也有属于它的生命周期. 人类大脑对图像的认知能力永远高于文字,因此 ...
- IoC基础篇(一)--- Spring容器中Bean的生命周期
日出日落,春去秋来,花随流水,北雁南飞,世间万物皆有生死轮回.从调用XML中的Bean配置信息,到应用到具体实例中,再到销毁,Bean也有属于它的生命周期. 人类大脑对图像的认知能力永远高于文字,因此 ...
- Spring 学习笔记---Bean的生命周期
生命周期图解 由于Bean的生命周期经历的阶段比较多,我们将通过一个图形化的方式进行描述.下图描述了BeanFactory中Bean生命周期的完整过程: Bean 的生命周期从Spring容器着手实例 ...
- Spring容器中bean的生命周期以及关注spring bean对象的后置处理器:BeanPostProcessor(一个接口)
Spring IOC 容器对 Bean 的生命周期进行管理的过程: 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.将 Bean 实例传递给 ...
- Spring实战(二)Spring容器和bean的生命周期
引入问题: 在XML配置文件中配置bean后,这些文件又是如何被加载的?它们被加载到哪里去了? Spring容器——框架核心 1.什么是Spring容器?它的功能是什么? 在基于Spring的应用中, ...
- spring(二):bean的生命周期
bean的生命周期指的是bean的创建——>初始化——>销毁的过程,该过程是由spring容器进行管理的 我们可以自定义bean初始化和销毁的方法:容器在bean进行到当前生命周期时,调用 ...
- spring框架中Bean的生命周期
一.Bean 的完整生命周期 在传统的Java应用中,bean的生命周期很简单,使用Java关键字 new 进行Bean 的实例化,然后该Bean 就能够使用了.一旦bean不再被使用,则由Java自 ...
随机推荐
- Oracle-手工生成AWR
运行awrrpt脚本 SQL> @?/rdbms/admin/awrrpt Current Instance ~~~~~~~~~~~~~~~~ DB Id DB Name ...
- ORA-01034、ORA-27101、ORA-00119错误
ORA-01034ORA-27101Linux-x86_64 Error: 2:No such file or directory. 或者是 ORA-00119: invalid specificat ...
- c++结构体、共用体和枚举
结构体类型 c++中的结构体成员既可以是数据,也可以是函数 c语言中定义结构体变量必须加struct(这也是很多时候和typedef),但是在c++里面,可以不加 结构体和类的不同在于,结构体中的变量 ...
- android遮罩阴影对话框的实现
定义 <style name="MyDialog" parent="@android:Theme.Dialog"> <item name=&q ...
- nginx下的负载均衡
负载均衡应用场景: 普通web应用部署到多台应用服务器上,客户端通过访问应用服务器发送请求,最简单的就是n对1模式,n个客户端访问同一个应用服务器,这种情况当并发量大了,就无法应对,而且,如果只有一台 ...
- Openstack 实现技术分解 (2) 虚拟机初始化工具 — Cloud-Init & metadata & userdata
目录 目录 前文列表 扩展阅读 系统环境 前言 Cloud-init Cloud-init 的配置文件 metadata userdata metadata 和 userdata 的区别 metada ...
- django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.的解决办法
如题,这个错误的解决办法如下: 在代码文件的最上方添加以下代码: import os,django os.environ.setdefault("DJANGO_SETTINGS_MODULE ...
- HTML CSS JS 特殊字符(转义)表
HTML有许多特殊的字符,您对此有多少了解?平时在WEB制作中,您又有用到多少?或者说你在平时使用之时,是否也会碰到,有许多特殊字符要如何打印出来?比如说“笑脸”,比如说“版权号”.要是你用时忘记了这 ...
- python实例1-找质数/素数
质数定义:质数(prime number)又称素数.质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数. 示例解决方案1 有很多方法可以解决这个问题,下面是一些例子:这是一个不同的功能分解 ...
- POJ 1330 Nearest Common Ancestors (dfs+ST在线算法)
详细讲解见:https://blog.csdn.net/liangzhaoyang1/article/details/52549822 zz:https://www.cnblogs.com/kuang ...