【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. Rails5入门

    更新: 2017/05/29 更新: 2017/09/07 补充对ruby自身的扩张的放置位置  配置文件位置  /config/routes.rb  最简单的定义方法  get ('hello/in ...

  2. bzoj 1705: [Usaco2007 Nov]Telephone Wire 架设电话线【dp】

    i的初始化写成2了于是成功查错2h--怕不是个傻子 设f[i][j]为第i根高为j,转移是 \[ f[i][j]=min(f[i-1][k]+abs(k-j)*c+(j-h[i])^2)(j>= ...

  3. sql server 大数据处理

    对SQL Server数据表进行分区的过程分为三个步骤: 1)建立分区函数 2)建立分区方案 3)对表格进行分区 第一个步骤:建立分区函数 分区函数定义[u]how[/u],即你想要SQL Serve ...

  4. npm install 安装软件,出现 operation not permitted, mkdir 'C:\Program Files\nodejs\node_cache'

    问题如下图: 解决办法: 在开始菜单栏里打开cmd的时,右击选择“以管理员身份运行”.然后再在打开的cmd里运动install就没问题了. 这个问题应该是当时安装依赖时,我们是以管理员身份运行的:所以 ...

  5. 二分搜索 HDOJ 2289 Cup

    题目传送门 /* 二分搜索:枚举高度,计算体积与给出的比较. */ #include <cstdio> #include <algorithm> #include <cs ...

  6. linux 常用shell命令之wc

    wc:查看文件统计信息 用法:$ wc filename 1. $ wc fileName $ wc fileName X Y Z /Desktop/hello X:表示行数 Y:表示单词数 Z:表示 ...

  7. JavaScript(十)基本包装类

    基本包装类都具有对象的基本方法     toString   和 valueOf Number 数字是原始类型,那为啥还有方法? 因为他在执行方法的时候会创建一个对应的包装类对象,这个对象有这种方法, ...

  8. MAMP中Python安装MySQLdb

    Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. MySQLdb 是用于Python链接Mysql数据库的接口,它实现了 Py ...

  9. JavaScript开发心得--如何传递某行数据给下一页

    1, 应用场景 在某个html页面显示一批数据,如20个用户的名称.年龄等,每行都要一个编辑按钮,点击编辑后,将此行数据带入某个专门的编辑页进行显示,修改后保存. 问题是 点击编辑按钮后,如何得知要编 ...

  10. php redis 操作大全

    类和方法 用法 Redis类 类RedisException 预定义的常量 Redis类 说明:创建一个Redis客户端 例 $redis = new Redis(); 类RedisException ...