8 -- 深入使用Spring -- 1...1Bean后处理器
8.1.1 Bean后处理器(BeanPostProcessor)
Bean后处理器主要负责对容器中其他Bean执行后处理,例如为容器中的目标Bean生成代理等。
Bean后处理器会在Bean实例创建成功之后,对Bean实例进行进一步的增强处理。
Bean后处理器必须实现BeanPostProcessor接口,BeanPostProcessor接口包含如下两个方法:
⊙ Object postProcessBeforInitialization(Object Bean,String name) throws BeanException : 该方法的第一个参数是系统即将进行后处理的Bean实例,第二个参数是该Bean的配置id。在目标Bean初始化之前被回调。
⊙ Object postProcessAfterInitialization(Object Bean,String name) throws BeanException : 该方法的第一个参数是系统即将进行后处理的Bean实例,第二个参数是该Bean的配置id。在目标Bean初始化之后被回调。
Demo-----------------
Class : Chinese
package edu.pri.lime._8_1_1.bean.impl; import org.springframework.beans.factory.InitializingBean; import edu.pri.lime._8_1_1.bean.Axe;
import edu.pri.lime._8_1_1.bean.Person; public class Chinese implements Person,InitializingBean{ private String name;
private Axe axe; public Chinese() {
super();
System.out.println("1.Spring 实例化主调Bean:Chinese实例。。。");
} public String getName() {
return name;
}
public void setName(String name) {
System.out.println("2.Spring 执行setName() 方法注入依赖关系。。。");
this.name = name;
}
public Axe getAxe() {
return axe;
}
public void setAxe(Axe axe) {
System.out.println("2.Spring 执行setAxe() 方法注入依赖关系。。。");
this.axe = axe;
}
public void afterPropertiesSet() throws Exception {
System.out.println("4.1生命周期方法。。。");
} public void init(){
System.out.println("4.2生命周期方法。。。");
}
public void useAxe() {
System.out.println(name + axe.chop());
} }
Class : MyBeanPostProcessor
package edu.pri.lime._8_1_1; import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor; import edu.pri.lime._8_1_1.bean.impl.Chinese; public class MyBeanPostProcessor implements BeanPostProcessor { /**
* 对容器中Bean实例进行后处理
* @param bean 需要进行后处理的原Bean实例
* @param beanName 需要进行后处理的Bean的配置id
* @return 返回后处理完成或测Bean
*/
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("3.Bean 后处理器在初始化之前对" + beanName + "进行增强处理。。。");
//返回的处理或的Bean实例,该实例就是容器中实际使用的Bean
return bean;
} public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("5.Bean 后处理器在初始化之后对" + beanName + "进行增强处理。。。");
if(bean instanceof Chinese){
Chinese chinese = (Chinese)bean;
chinese.setName("Oracle");
}
return bean;
} }
XML :
<?xml version="1.0" encoding="UTF-8"?>
<!-- Spring 配置文件的根元素,使用Spring-beans-4.0.xsd语义约束 -->
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"> <bean id="chinese" class="edu.pri.lime._8_1_1.bean.impl.Chinese" init-method="init">
<property name="name" value="lime"/>
<property name="axe" ref="steelAxe"/>
</bean> <bean id="steelAxe" class="edu.pri.lime._8_1_1.bean.impl.SteelAxe"/> <!-- 配置Bean后处理器,可以无须指定id属性 -->
<bean class="edu.pri.lime._8_1_1.MyBeanPostProcessor"/> </beans>
Class : BeanPostProcessorMain
package edu.pri.lime._8_1_1.bean.main; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import edu.pri.lime._8_1_1.bean.Person;
import edu.pri.lime._8_1_1.bean.impl.Chinese; public class BeanPostProcessorMain {
public static void main(String[] args){
ApplicationContext ctx = new ClassPathXmlApplicationContext("app_8_1_1.xml");
Person person = ctx.getBean("chinese",Chinese.class);
person.useAxe();
}
}
Console :
1.Spring 实例化主调Bean:Chinese实例。。。
3.Bean 后处理器在初始化之前对steelAxe进行增强处理。。。
5.Bean 后处理器在初始化之后对steelAxe进行增强处理。。。
2.Spring 执行setName() 方法注入依赖关系。。。
2.Spring 执行setAxe() 方法注入依赖关系。。。
3.Bean 后处理器在初始化之前对chinese进行增强处理。。。
4.1生命周期方法。。。
4.2生命周期方法。。。
5.Bean 后处理器在初始化之后对chinese进行增强处理。。。
2.Spring 执行setName() 方法注入依赖关系。。。
Oracle使用钢斧砍材真快
如果使用ApplicationContext作为Spring容器,Spring容器会自动检测容器中的所有Bean,如果发现某个Bean类实现了BeanPostProcessor接口,ApplicationContext 会自动将其注册为Bean后处理器。
Bean后处理器两个方法的回调时机:

如果使用BeanFactory作为Spring容器,则必须手动注册Bean后处理器,程序必须获取Bean后处理器实例,然后手动注册,这就需要在配置文件中为Bean处理器指定id属性。
Resource isr = new ClassPathResource("app_8_1_1.xml");
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
new XmlBeanDefinitionReader(beanFactory).loadBeanDefinitions(isr);
// 获取容器中的Bean后处理器
BeanPostProcessor bp = (BeanPostProcessor)beanFactory.getBean("bp");
// 注册Bean后处理器
beanFactory.addBeanPostProcessor(bp);
Person per = (Person) beanFactory.getBean("chinese");
per.useAxe();
啦啦啦
8 -- 深入使用Spring -- 1...1Bean后处理器的更多相关文章
- 半夜思考之查漏补缺, Spring 的 Bean 后处理器
有一篇写的是容器后处理器, 这篇是 Bean 后处理器 , 我对这个 Bean 后处理器的理解就是一个 AOP 编程 . Bean 后处理器 : 是一种特殊的 Bean , 这种 Bean 不对外提供 ...
- Spring之bean后处理器
Bean后处理器是一种特殊的Bean,容器中所有的Bean在初始化时,均会自动执行该类的两个方法.由于该Bean是由其它Bean自动调用执行,不是程序员手工调用,故此Bean无须id属性.需要做的是, ...
- Spring Bean后处理器以及容器后处理器【转】
Bean后处理器:即当spring容器实例化Bean实例之后进行的增强处理. 容器后处理器:对容器本身进行处理,并总是在容器实例化其他任何Bean之前读取配置文件的元数据并可能修改这些数据. 一.Be ...
- XI.spring的点点滴滴--IObjectFactoryPostProcessor(工厂后处理器)
承接上文 IObjectFactoryPostProcessor(工厂后处理器)) 前提是实现接口的对象注册给当前容器 直接继承的对象调用这个postProcessBeanFactory方法,参数为工 ...
- Ⅹ.spring的点点滴滴--IObjectPostProcessor(对象后处理器)
承接上文 IObjectPostProcessor(对象后处理器) 前提是实现接口的对象注册给当前容器 C#: 通过继承AbstractObjectFactory对象的AddObjectPostPro ...
- Spring - BeanPostProcessor接口(后处理器)讲解
概述: BeanPostProcessor接口是众多Spring提供给开发者的bean生命周期内自定义逻辑拓展接口中的一个,其他还有类似InitializingBean,DisposableBean, ...
- Spring框架——后处理器
Bean的后处理 Spring容器实例化Bean实例之后进行的增强处理,关于这里的描述之前有点错误,现在来纠正一下:这个过程有点像AOP,不过我们知道AOP是对方法而言的,而Bean后处理器是针对Ja ...
- Spring的后处理器-BeanPostProcessor跟BeanFactoryPostProcessors
最近在重读spring源码(为什么要重读?因为不得不承认,去年跟着<深入解析sping源码>一书过了一遍spring的源码,除了满脑袋都是各种BeanFactory跟BeanDefinit ...
- Spring 如何保证后置处理器的执行顺序 - OrderComparator
Spring 如何保证后置处理器的执行顺序 - OrderComparator Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.htm ...
随机推荐
- Extjs4.x MVC开发模式,效率提高的两大秘诀
最近做MVC开发的,遇到一个蛋疼的问题,每次加载模块都需要耗时3~4秒钟,才可以显示出完整的页面,通过监控,发现主要还是在Controller里慢,加载js文件等都是非常快的,但一到controlle ...
- openvpn之client配置篇
对于client端,其配置目录文件下有如下文件: [root@localhost client1]# ll total -rw-r--r-- nobody nobody Sep ca.crt -rw- ...
- "No user exists for uid 501"
"No user exists for uid 501" 问题表现:git操作远端失败. iterm2的问题,更改了配置可能导致这个问题,最简单的解决办法,退出客户端后重启.重 ...
- Redis 实现消息队列 MQ
Redis 2.4版本之后就内置队列的功能了,如果是日常比较简单的队列应用,可以选择Redis , 效率还很高的!! Redis 还能实现 有序 和 无序 两种队列(只讨论生产者和消费者这种模式的队列 ...
- SpagoBI 教程 Lesson 3: Highchart Dashboards
SpagoBI Lesson 3: Highchart Dashboards Business Intelligence dashboards Every car comes with a dash ...
- imx6 lvds0 lvds1 display
最近调试imx6的屏幕显示,笔记记录于此. 官方文档关于uboot参数的介绍: sin和dul参数已经测试过,sep和spl还没有验证成功. 1 单屏显示 说明:输入命令并按确定键, 观察系统启动过程 ...
- 异常之交叉编译---arm-vfp-linux-gnu/bin/ld: cgic.o: Relocations in generic ELF (EM: 3)
/opt/arm-2009q1/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/../../../../arm-none-linux-gnueabi/bin/l ...
- EF5+MVC4系列(10) mvc的布局页面 _ViewStart.Cshtml
当客户端请求 /Product/Index的时候, 如果在视图的根目录下有 _ViewStart.Cshtml 就会先执行这个,再去执行 Product文件夹下的Index视图, 如果Product文 ...
- Erlang HTTP client:ibrowse
ibrowse: https://github.com/cmullaparthi/ibrowse
- Linux set unset命令
Linux unset命令: 功能说明:unset是一个内建的Unix shell命令,在Bourne shell家族(sh.ksh.bash等)和C shell家族(csh.tcsh等)都有实现. ...