IOC 容器中 Bean 的生命周期方法
Spring IOC 容器可以管理 Bean 的生命周期, Spring 允许在 Bean 生命周期的特定点执行定制的任务.
Spring IOC 容器对 Bean 的生命周期进行管理的过程:
- 通过构造器或工厂方法创建 Bean 实例
- 为 Bean 的属性设置值和对其他 Bean 的引用
- 调用 Bean 的初始化方法
- Bean 可以使用了
- 当容器关闭时, 调用 Bean 的销毁方法
在 Bean 的声明里设置 init-method 和 destroy-method 属性, 为 Bean 指定初始化和销毁方法.
注意:由于对xml不怎么了解,以为所有的xml头部的http xmln
都是一样的,然后跟着视频练习,报错:cvc-complex-type.3.2.2: 元素 'bean' 中不允许出现属性 'destory-method'
,当时百思不得其解,因为视频里的老师也没做什么特别的操作,然后问以前同事,他告诉我上面的http xlmn这种连接我没导入,尴尬。又是一个坑,踩到了。
重开一个包com.chenyixun,新建测试用的Main.java和Car.java,src下新建beans-cycle.xml
Car.java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public class Car { public Car() { super(); // TODO Auto-generated constructor stub System.out.println("constructor..."); } private String brand; public void setBrand(String brand) { System.out.println("setBrand..."); this.brand = brand; } public void init2() { System.out.println("init2..."); } public void destory() { System.out.println("destory..."); } }
|
beans-cycle.xml(注意该配置文件头部导入对应的http xmln连接):
1 2 3
| <bean id="car" class="com.chenyixun.Car" init-method="init2" destory-method="destory"> <property name="brand" value="玛莎拉蒂"></property> </bean>
|
Main.java:
1 2 3 4 5
| ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans-cycle.xml"); Car car = (Car)ctx.getBean("car"); System.out.println(car); // 关闭IOC容器 ctx.close();
|
运行打印输出发现,构造器最先打印,在容器关闭的时候调destory方法
创建 Bean 后置处理器
Bean 后置处理器允许在调用初始化方法前后对 Bean 进行额外的处理.
Bean 后置处理器对 IOC 容器里的所有 Bean 实例逐一处理, 而非单一实例. 其典型应用是: 检查 Bean 属性的正确性或根据特定的标准更改 Bean 的属性.
对Bean 后置处理器而言, 需要实现Interface BeanPostProcessor
接口. 在初始化方法被调用前后, Spring 将把每个 Bean 实例分别传递给上述接口的以下两个方法:
- postProcessAfterInitialization(Object bean, String beanName)
- postProcessBeforeinitialization(Object bean, String beanName)
Spring IOC 容器对 Bean 的生命周期进行管理的过程:
- 通过构造器或工厂方法创建 Bean 实例
- 为 Bean 的属性设置值和对其他 Bean 的引用
- 将 Bean 实例传递给 Bean 后置处理器的 postProcessBeforeInitialization 方法
- 调用 Bean 的初始化方法
- 将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization方法
- Bean 可以使用了
- 当容器关闭时, 调用 Bean 的销毁方法
1 2 3 4 5 6 7 8 9 10 11 12
| public class MyBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("postProcessBeforeInitialization: " + bean + "," + beanName); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("postProcessAfterInitialization: " + bean + "," + beanName); return bean; } }
|
需要在配置文件里面配置
1 2 3 4 5 6 7 8 9 10
| <!-- 实现BeanPostProcessor接口,并提供 Object postProcessBeforeInitialization(Object bean, String beanName): init-method方法之前 Object postProcessAfterInitialization(Object bean, String beanName): init-method方法之后 的实现 bean: bean本身 beanName: IOC容器配置bean的名字 返回值:实际上返回给用户的那个bean,注意:可以在以上两个方法中返回修改的bean,甚至返回一个新的bean --> <bean class="com.chenyixun.MyBeanPostProcessor"/>
|