【IOC容器中Bean的生命周期方法】

1.SpringIOC容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务。

2.Spring IOC容器对Bean的生命周期进行管理的过程:

--通过构造器或工厂方法创建Bean实例

--为Bean的属性设置值和对其他Bean的引用

--调用Bean的初始化方法

--Bean可以使用了

--当容器关闭时,调用Bean的销毁方法

3.在Bean的声明里设置init-method和destroy-method属性,为Bean指定初始化和销毁方法。

【示例】

beans-cycle.xml:

 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="car" class="com.hk.beans.cycle.Car"
init-method="init"
destroy-method="destroy">
<property name="brand" value="Audi"></property>
</bean>
</beans>

/spring-1/src/com/hk/beans/cycle/Car.java:

 package com.hk.beans.cycle;

 public class Car {
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 destroy(){
System.out.println("destroy......");
}
}

/spring-1/src/com/hk/beans/cycle/Main.java:

 package com.hk.beans.cycle;

 import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; 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); //关闭IOC容器
ctx.close();
}
}

运行结果:

注:通过结果可知Spring IOC容器对Bean的生命周期进行管理的过程和上述一致。

【创建Bean后置处理器】

1.Bean后置处理器允许在调用初始化方法前后对Bean进行额外的处理。

2.Bean后置处理器对IOC容器里的所有Bean实例逐一处理,而非单一实例。其典型应用是:检查Bean属性的正确性或根据特定的标准更改Bean的属性。

3.对Bean后置处理器而言,需要实现Interface BeanPOSTProcessor接口。在初始化方法被调用前后,Spring将把每个Bean实例分别传递给上述接口的以下两个方法:

-postProcessAfterInitialization(Object bean,String beanName)

-postProcessBeforeInitialization(Object bean,String beanName)

【添加Bean后置处理器后Bean的生命周期】

Spring IOC容器对Bean的生命周期进行管理的过程:

--通过构造器或工厂方法创建Bean实例

--为Bean的属性设置值和对其他Bean的引用

--将Bean实例传递给Bean后置处理器的postProcessBeforeInitialization方法

--调用Bean的初始化方法

--将Bean实例传递给Bean后置处理器的postProcessAfterInitialization方法

--Bean可以使用了

--当容器关闭时,调用Bean的销毁方法

配置文件beans-cycle.xml:

     <!-- 配置bean的后置处理器  -->
<bean class="com.hk.beans.cycle.MyBeanPostProcessor"></bean>

/spring-1/src/com/hk/beans/cycle/MyBeanPostProcessor.java:

 package com.hk.beans.cycle;

 import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor; public class MyBeanPostProcessor implements BeanPostProcessor{ @Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("postProcessAfterInitialization:"+ bean + "," + beanName);
return bean;
} @Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("postProcessBeforeInitialization:"+ bean + "," + beanName);
return bean;
}
}

运行结果:

应用:

首先确定配置文件中value="Audi":

     <bean id="car" class="com.hk.beans.cycle.Car"
init-method="init"
destroy-method="destroy">
<property name="brand" value="Audi"></property>
</bean>

在MyBeanPostProcessor.java中改变postProcessAfterInitialization中的代码:

     public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("postProcessAfterInitialization:"+ bean + "," + beanName);
Car car = new Car();
car.setBrand("Ford");
return car;
}

运行结果:

【小结】

实现BeanPostProcessor接口,并具体提供两个方法的实现:
Object postProcessAfterInitialization(Object bean, String beanName):init-method之前被调用
Object postProcessBeforeInitialization(Object bean, String beanName):init-method之后被调用

参数:
bean:bean实例的本身
beanName:IOC容器中配置bean的名字
返回值:是实际上返回给用户的那个bean,注意:可以在以上两个方法中修改返回的bean,甚至返回一个新的bean.

配置bean的后置处理器 :不需要id,IOC容器自动识别是一个BeanPostProcessor

管理Bean的生命周期的更多相关文章

  1. Spring4.0学习笔记(5) —— 管理bean的生命周期

    Spring IOC 容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务 Spring IOC 容器对Bean的生命周期进行管理的过程: 1.通过构造器或工厂方法 ...

  2. Spring_管理bean的生命周期

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

  3. 【Spring注解驱动开发】使用InitializingBean和DisposableBean来管理bean的生命周期,你真的了解吗?

    写在前面 在<[Spring注解驱动开发]如何使用@Bean注解指定初始化和销毁的方法?看这一篇就够了!!>一文中,我们讲述了如何使用@Bean注解来指定bean初始化和销毁的方法.具体的 ...

  4. Spring——管理Bean的生命周期

    我们可以自定义bean的初始化和销毁方法,这里所指的的初始化和bean的构造不同,初始化是在bean构造完成后,对bean内部的属性或一些逻辑进行初始化. 首先要弄清一些概念: 构造(对象创建) 单实 ...

  5. Spring管理bean的生命周期

    1: bean的创建:   如果我们默认的scope配置为Singleton的话, bean的创建实在Spring容器创建的时候创建: 如果scope的配置为Prototype的话,bena的创建是在 ...

  6. Spring_管理 Bean 的生命周期

    beans-cycle.xml <?xml version="1.0" encoding="UTF-8"?><beans xmlns=&quo ...

  7. IOC容器中bean的生命周期

    一.Bean的生命周期 Spring IOC容器可以管理Bean的生命周期,允许在Bean生命周期的特定点执行定制的任务. Spring IOC容器对Bean的生命周期进行管理的过程如下: (1).通 ...

  8. 使用外部属性文件配置Bean以及Bean的生命周期方法

    1.使用外部属性文件配置Bean 在配置文件里配置 Bean 时, 有时需要在 Bean 的配置里混入系统部署的细节信息(例如: 文件路径, 数据源配置信息等). 而这些部署细节实际上需要和 Bean ...

  9. Spring的Bean的生命周期以及Bean的后置处理器

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

随机推荐

  1. LD_LIBRARY_PATH设置问题

    今天突然遇到设置LD_LIBRARY_PATH的问题,,发现在.bashrc和/etc/profile中添加 exportLD_LIBRARY_PATH = path_name:$LD_LIBRARY ...

  2. 6章 Models

    传统的MVC结构中,有模型这么一个概念.Django中,Models又是怎么一回事呢? 刚才生成的这些乱七八糟的数据迁移就是Django自带的一些应用 INSTALLED_APPS = [ 'djan ...

  3. bzoj 1621: [Usaco2008 Open]Roads Around The Farm分岔路口【dfs】

    模拟就行--讲道理这个时间复杂度为啥是对的??? #include<iostream> #include<cstdio> using namespace std; int k, ...

  4. 10.24afternoon清北学堂刷题班

    /* 这是什么题... */ #include<iostream> #include<cstdio> #include<cstring> #include<q ...

  5. 靶形数独 2009年NOIP全国联赛提高组(搜索)

    靶形数独 2009年NOIP全国联赛提高组  时间限制: 4 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Description 小城和小华都是热爱数 ...

  6. centos 重装docker

    docker应该是root用户来使用,因为他连接了底层!!!以下操作默认是root用户来操作的 停止所有正在运行的容器: docker stop $(docker ps -a -q) 删除所有的容器c ...

  7. 探寻宝藏 --- 双线DP

    双线DP , 在郑轻的时候 做过 这种双线DP  ,  这是多维DP 应该是比较简单的  但是那个 时间复杂度的优化 始终看不懂 .  先附上代码吧 , 等看懂了再来 , 补充一下 解释  . #in ...

  8. 51nod 1018 排序

    1018 排序 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出N个整数,对着N个整数进行排序 Input 第1行:整数的数量N(1 <= N  ...

  9. Storm概念学习系列之storm的雪崩

    不多说,直接上干货! Storm的雪崩问题的解决办法1: Storm概念学习系列之并行度与如何提高storm的并行度 Storm的雪崩问题的解决办法2:

  10. 1、DOS基本命令

    命令dir能给列出当前目录下面的所有文件.程序和子目录.所有目录(Windows 中称为文件夹)的目录名前面都有一个<DIR>标记.文件和程序名前面显示有这些文件和程序的大小. 想说的是, ...