Spring学习记录(八)---Bean的生命周期
之前说过,在调用下面时,就创建了容器和对象
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的生命周期的更多相关文章
- MyEclipse Spring 学习总结二 Bean的生命周期
文件结构可以参考上一节 Bean的生命周期有方法有:init-method,destroy-method ApplicationContext.xml 文件配置如下: <?xml version ...
- Spring系列13:bean的生命周期
本文内容 bean的完整的生命周期 生命周期回调接口 Aware接口详解 Spring Bean的生命周期 面试热题:请描述下Spring的生命周期? 4大生命周期 从源码角度来说,简单分为4大阶段: ...
- spring IOC 容器中 Bean 的生命周期
IOC 容器中 Bean 的生命周期: 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.调用 Bean 后置处理器接口(BeanPostPr ...
- Spring IOC容器中Bean的生命周期
1.IOC容器中Bean的生命周期 构造器函数 设置属性 初始化函数(在Bean配置中 init-method) 使用Bean 结束时关闭容器(在Bean中配置destroy-method) 2.Be ...
- Spring应用上下文中Bean的生命周期
Bean装载到Spring应用上下文的生命周期,如图: Bean在Spring容器中从创建到销毁经历了若干个阶段,每一阶段都可以对Spring如何管理Bean进行个性化定制,以下我们通过代码去验证生命 ...
- Spring学习记录(五)---bean的作用域scope
作用域:singleton:单例,整个应用中只创建一个实例(默认) prototype:原型,每次注入时都新建一个实例 session:会话,每个会话创建一个实例 request:请求,每个请求创建一 ...
- Spring学习记录(四)---bean之间的关系:继承、依赖
继承 这里说的继承和java的继承是不一样的,不是父类子类.但思想很相似,是父bean和子bean 1.父bean是一个实例时.它本身是一个完整的bean 2.父bean是模板,抽象bean ...
- Spring学习记录(三)---bean自动装配autowire
Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系,少写几个ref autowire: no ---默认情况,不自动装配,通过ref手动引用 byName---根据 ...
- Spring IOC容器对bean的生命周期进行管理的过程
1.通过构造器或者工厂方法创建bean的实例 2.为bean的属性设置值和对其他bean的引用 3.将bean的实例传递给bean的后置处理器BeanPostProcessor的postProcess ...
随机推荐
- iOS 之 退出app(项目)的几种方法
路漫漫其修远兮,吾将上下而求索.也算是对程序员的一种真实写照了吧. 今天想研究一下iOS中退出项目的方法,说是今天,其实也关注并去了解很久了.只是始终找不到自己认为很好的方法.今天就先把自己了解的列举 ...
- [转]oracle分析函数Rank, Dense_rank, row_number
oracle分析函数Rank, Dense_rank, row_number 分析函数2(Rank, Dense_rank, row_number) 目录 ==================== ...
- WPF CodeBehind后台动态创建图片及添加事件
问题:WPF中DataGrid需要动态生成列并绑定值,首列包含图片和文本,点击图片触发事件. 难点:1.图片资源在VisualTree中的绑定 2.图片的事件绑定 public class Mai ...
- Linux内核笔记--网络子系统初探
内核版本:linux-2.6.11 本文对Linux网络子系统的收发包的流程进行一个大致梳理,以流水账的形式记录从应用层write一个socket开始到这些数据被应用层read出来的这个过程中linu ...
- 阅读jquery源码与js依赖加载的模块化!
阅读源码肯定是先下载有注释的源码 我也是醉了,10309 行代码,在陆续续的一个月之内,看完了,虽有收获但收获不大, 直到又一次看jquery的github,怎么会有cmd????没听过使用jquer ...
- Junit测试框架 Tips
关于Junit测试框架使用的几点总结: 1.Junit中的测试注解: @Test →每个测试方法前都需要添加该注解,这样才能使你的测试方法交给Junit去执行. @Before →在每个测试方法执行前 ...
- excel使用总结
单元格拆分:选中列-->数据-->分列 常用函数: clean 清除文本中不能打印的字符 countif,countifs,在指定区域中按指定条件对单元格进行计数(单条件计数,多条件计数) ...
- VMware创建Linux虚拟机并安装CentOS(一)
在VMware中新建虚拟机,在新建虚拟机向导中,选择“自定义(高级)”选项,鼠标单击“继续”按钮 选择VMware的版本workstation9.0(VMware版本对硬盘.内存.cpu等硬件的支持大 ...
- Xcode8中处理打印日志的配置
Xcode8中处理打印日志的配置
- 关于Hibernate的Dialect
org.hibernate HibernateException Dialect must be explicitly set :*** 使用Hibernate,有时候会遇到类似上面的异常. 使用 ...