之前说过,在调用下面时,就创建了容器和对象

    ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");

那它又是怎样一步步创建的呢?要销毁怎么销毁?

用一个例子来看

 package com.guigu.spring.Car;

 public class Car {
private String brand; public Car(){
System.out.println("构造函数。。");
}
public String getBrand() {
System.out.println("返回属性。。");
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
System.out.println("设置属性。。");
}
public void init(){
System.out.println("init()。。");
}
public void destroy(){
System.out.println("destroy()。。");
}
}

xml中用init-mehod、 destroy-method表示调用初始化函数和销毁函数

 <bean id="car" class="com.guigu.spring.Car" init-method="init" destroy-method="destroy">
<property name="brand" value="Aodi"></property>
</bean>

main中

   ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
Car car=(Car)ctx.getBean("car");
System.out.println(car);
//关闭IOC容器
ctx.close();

输出:

  构造函数。。
  设置属性。。
  init()。。
  car[brand=Aodi]
  destroy()。。

可以看出来,先调用构造函数和设置属性,然后再init()。

 bean后置处理器:检查bean属性的正确性或根据需要修改属性,要实现BeanPostProcessor接口

写一个实现类MyBeanPostProcessor

 package com.guigu.spring.Car;

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

xml中添加此接口

   <bean id="car" class="com.guigu.spring.Car" init-method="init" destroy-method="destroy">
<property name="brand" value="Aodi"></property>
</bean>
4 <!--配置bean后置处理器,不需要配置id-->
5 <bean class="com.guigu.spring.Car"></bean>

再重新运行一次,输出:

   构造函数。。
设置属性。。
postProcessBoforeInitialization: car[brand=Aodi], car

init()。。
postProcessAfterInitialization: car[brand=Aodi], car car[brand=Aodi]
destroy()。。

注意:一个再init之前调用,一个再init之后调用

如何修改属性? 在接口函数中修改

 package com.guigu.spring.Car;

 import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor; import com.guigu.spring.autowireautowire.Car; 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);
Car car = (Car) bean; // 获取要修改的bean对象
car.setBrand("Ford"); //修改属性
return bean;
}
}

注意:上面的bean是bean实例本身;beanName指IOC容器配置的bean的名字

这样,就成功修改了属性,输出:

    构造函数。。
设置属性。。
postProcessBoforeInitialization:car[brand=Aodi], car
init()。。
postProcessAfterInitialization: car[brand=Aodi], car car[brand=Ford]
destroy()。。

还可以过滤,因为处理所有bean时,可能对某些进行操作

     @Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("postProcessBeforeInitialization: "+bean +beanName); if("car".equals(beanName)){
//过滤的操作
}
return bean;
}

再看一遍bean生命周期

Spring学习记录(八)---Bean的生命周期的更多相关文章

  1. MyEclipse Spring 学习总结二 Bean的生命周期

    文件结构可以参考上一节 Bean的生命周期有方法有:init-method,destroy-method ApplicationContext.xml 文件配置如下: <?xml version ...

  2. Spring系列13:bean的生命周期

    本文内容 bean的完整的生命周期 生命周期回调接口 Aware接口详解 Spring Bean的生命周期 面试热题:请描述下Spring的生命周期? 4大生命周期 从源码角度来说,简单分为4大阶段: ...

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

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

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

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

  5. Spring应用上下文中Bean的生命周期

    Bean装载到Spring应用上下文的生命周期,如图: Bean在Spring容器中从创建到销毁经历了若干个阶段,每一阶段都可以对Spring如何管理Bean进行个性化定制,以下我们通过代码去验证生命 ...

  6. Spring学习记录(五)---bean的作用域scope

    作用域:singleton:单例,整个应用中只创建一个实例(默认) prototype:原型,每次注入时都新建一个实例 session:会话,每个会话创建一个实例 request:请求,每个请求创建一 ...

  7. Spring学习记录(四)---bean之间的关系:继承、依赖

         继承 这里说的继承和java的继承是不一样的,不是父类子类.但思想很相似,是父bean和子bean 1.父bean是一个实例时.它本身是一个完整的bean 2.父bean是模板,抽象bean ...

  8. Spring学习记录(三)---bean自动装配autowire

    Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系,少写几个ref autowire: no ---默认情况,不自动装配,通过ref手动引用 byName---根据 ...

  9. Spring IOC容器对bean的生命周期进行管理的过程

    1.通过构造器或者工厂方法创建bean的实例 2.为bean的属性设置值和对其他bean的引用 3.将bean的实例传递给bean的后置处理器BeanPostProcessor的postProcess ...

随机推荐

  1. c#教程之通过数据绑定修改数据

    通过数据绑定修改数据 "实体框架"提供了与数据库的双向通信通道.前面已经讲述了如何使用"实体框架"获 取数据,现在来看看如何修改获取的信息,并将改动发送回数据库 ...

  2. Angular内置指令(一)

    要注意的是不要把自己开发的指令以ng开头,以免与内置指令冲突  目录:ng-disabled,ng-readonly,ng-checked,ng-selected,ng-href,ng-src,ng- ...

  3. ElasticSearch问题记录

    1.Young GC导致集群master重新选举,一台server fail [2016-12-10 07:38:24,546][WARN ][transport ] [BFRD_1] Receive ...

  4. Android 照相 滤镜

    android-image-filter 19种相片滤镜,使用也简单,all filters in file BitmapFilter.java : Bitmap newBitmap = Bitmap ...

  5. 洛谷 P1182 数列分段Section II Label:贪心

    题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 1要分成3段 将其如下分段: [4 ...

  6. 【BZOJ3314】 [Usaco2013 Nov]Crowded Cows 单调队列

    第一次写单调队列太垃圾... 左右各扫一遍即可. #include <iostream> #include <cstdio> #include <cstring> ...

  7. Axure的学习

    这两天开始学习Axure,首先做的是下载Axure的7.0版本,然后汉化,可以百度找.不过我在开始学习时也遇到一些问题.在开始添加元件库时还是很顺利的,不过在我发布的时候,我发现了一些问题.发布一开始 ...

  8. c#文本转语音以及语音阅读小实例

    c#实现语音阅读以及文本转语音文件是基于c#的一个类库(SpeechSynthesizer )实现的,使用该类必须要添加引用using System.Speech.Synthesis;直接是无法添加引 ...

  9. 《JavaScript Dom编程艺术》(第二版)

    第一章<JavaScript简史> 1.JavaScript是一种脚本语言,通常只能通过Web浏览器去完成一些操作而不能像普通意义上的程序那样独立运行,它需要由Web浏览器进行解释和执行. ...

  10. Odoo 二次开发教程(五)-新API的介绍与应用

    [关于odoo新API的介绍,Internet上资料很少,或者不够完整详实,这会对初学者造成很大的困惑,本篇的目的就是希望能帮助新手了解新API的大概] odoo 新api的实现是借助于python装 ...