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后处理器的更多相关文章

  1. 半夜思考之查漏补缺, Spring 的 Bean 后处理器

    有一篇写的是容器后处理器, 这篇是 Bean 后处理器 , 我对这个 Bean 后处理器的理解就是一个 AOP 编程 . Bean 后处理器 : 是一种特殊的 Bean , 这种 Bean 不对外提供 ...

  2. Spring之bean后处理器

    Bean后处理器是一种特殊的Bean,容器中所有的Bean在初始化时,均会自动执行该类的两个方法.由于该Bean是由其它Bean自动调用执行,不是程序员手工调用,故此Bean无须id属性.需要做的是, ...

  3. Spring Bean后处理器以及容器后处理器【转】

    Bean后处理器:即当spring容器实例化Bean实例之后进行的增强处理. 容器后处理器:对容器本身进行处理,并总是在容器实例化其他任何Bean之前读取配置文件的元数据并可能修改这些数据. 一.Be ...

  4. XI.spring的点点滴滴--IObjectFactoryPostProcessor(工厂后处理器)

    承接上文 IObjectFactoryPostProcessor(工厂后处理器)) 前提是实现接口的对象注册给当前容器 直接继承的对象调用这个postProcessBeanFactory方法,参数为工 ...

  5. Ⅹ.spring的点点滴滴--IObjectPostProcessor(对象后处理器)

    承接上文 IObjectPostProcessor(对象后处理器) 前提是实现接口的对象注册给当前容器 C#: 通过继承AbstractObjectFactory对象的AddObjectPostPro ...

  6. Spring - BeanPostProcessor接口(后处理器)讲解

    概述: BeanPostProcessor接口是众多Spring提供给开发者的bean生命周期内自定义逻辑拓展接口中的一个,其他还有类似InitializingBean,DisposableBean, ...

  7. Spring框架——后处理器

    Bean的后处理 Spring容器实例化Bean实例之后进行的增强处理,关于这里的描述之前有点错误,现在来纠正一下:这个过程有点像AOP,不过我们知道AOP是对方法而言的,而Bean后处理器是针对Ja ...

  8. Spring的后处理器-BeanPostProcessor跟BeanFactoryPostProcessors

    最近在重读spring源码(为什么要重读?因为不得不承认,去年跟着<深入解析sping源码>一书过了一遍spring的源码,除了满脑袋都是各种BeanFactory跟BeanDefinit ...

  9. Spring 如何保证后置处理器的执行顺序 - OrderComparator

    Spring 如何保证后置处理器的执行顺序 - OrderComparator Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.htm ...

随机推荐

  1. Android指南 - 主题

      译者注:theme(主题)和style(样式)是专用术语,下面对这两个词汇不在使用中文词汇.   theme 是安卓的一种机制,用于为应用程序和activity提供一致的样式(style).样式s ...

  2. PHP与Java进行通信的实现方法

    缘起: 最近做了一个电商平台与网银整合的小东西,程序是开源的 Ecmall的,网银的接口也很规范,给出的文档很全,唯一的小问题是,网银使用的签名和验签的lib是只有java和c的,对java还熟悉一些 ...

  3. [技术选型] CDH-Cloudera Distribution Hadoop

    hadoop是一个开源项目,所以很多公司在这个基础进行商业化,Cloudera对hadoop做了相应的改变. Cloudera公司的发行版,我们将该版本称为CDH(Cloudera Distribut ...

  4. 关于socket的知识总结

    简单点说: 阻塞就是干不完不准回来,    非组赛就是你先干,我现看看有其他事没有,完了告诉我一声 我们拿最常用的send和recv两个函数来说吧... 比如你调用send函数发送一定的Byte,在系 ...

  5. 自然语言交流系统 phxnet团队 创新实训 个人博客 (八)

    今天想测试一下“庖丁”分词的效果,编写了一个测试小程序,从文件中读入文本,并将分词结果显示到控制台. 环境平台:Win7+eclipse 过程如下: 1.编辑paoding-analysis.jar中 ...

  6. java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer

    hibernate查询结果条数集 原写法: Integer count = (Integer )session.createQuery(hql).uniqueResult(); 报错:java.lan ...

  7. MySQL导入数据错误error: 13 及解决办法

    先说解决办法 将sql文件放到你的账号能够访问的地方!!! 因为我用的grid账号,所以只需要将sql放到 ~grid/ 或者 /tmp等grid能够访问的地方即可. Don't place the ...

  8. 安卓横竖屏切换时activity的生命周期

    关于Activity横竖屏切换的声明周期变化: 1.新建一个Activity并把各个生命周期打印出来 2.运行Activity,得到如下信息 onCreate-->onStart-->on ...

  9. Eclipse JUnit简单示例

    在本节中,我们将看到一个简单的JUnit例子. 先创建一个工程,名称为:CalculateTest,并在这个工程上点击右键,选择:Build Path -> Add Library -> ...

  10. spring的InitializingBean的 afterPropertiesSet 方法 和 init-method配置的区别联系

    InitializingBean Spirng的InitializingBean为bean提供了定义初始化方法的方式.InitializingBean是一个接口,它仅仅包含一个方法:afterProp ...