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. Extjs4.x MVC开发模式,效率提高的两大秘诀

    最近做MVC开发的,遇到一个蛋疼的问题,每次加载模块都需要耗时3~4秒钟,才可以显示出完整的页面,通过监控,发现主要还是在Controller里慢,加载js文件等都是非常快的,但一到controlle ...

  2. MongoDB 运行状态、性能监控,分析

    这篇文章的目的是让你知道怎么了解你正在运行的Mongdb是否健康.转载自http://tech.lezi.com/archives/290 mongostat详解 启动mongodb监控,通过下面命令 ...

  3. 通过android studio上传项目到github

    第一步,下载git客户端,并且安装 下载地址:https://git-for-windows.github.io/ 第二步,在android studio中配置git(注意第一张图中的C:\Progr ...

  4. Windows 7 incorrectly reports "No Internet Access"

    PROBLEM DESCRIPTION Windows 7 may sometimes report that it has "No Internet Access"; this ...

  5. 《FPGA全程进阶---实战演练》第二十一章 细说低速与高速电路设计之电阻 电容 电感 磁珠

      1.1 什么是高速电路 信号的最高频率成分是取决于有效频率,而不是周期频率. 高速电路的定义是根据信号的有效频率来计算的,在现实世界中,任何信号都是由多个频率分量的正弦波叠加而成的.定义各正弦波分 ...

  6. tornado 的 define 和options方法解读

    一.源码解读 tornado是facebook开源的非阻塞web容器,类似java的netty,tornado.options是负责解析tornado容器的全局参数的,同时也能够解析命令行传递的参数和 ...

  7. SQLSERVER中统计所有表的记录数

    SQLSERVER中统计所有表的记录数 利用系统索引表sysindexes中索引ID indid<1的行中的rows列存有该表的行数这一特点.    方法是利用隐藏未公开的系统存储过程sp_MS ...

  8. 第三百八十八节,Django+Xadmin打造上线标准的在线教育平台—网站列表分页

    第三百八十八节,Django+Xadmin打造上线标准的在线教育平台—网站列表分页 分页可以用一个第三方分页模块django-pure-pagination 下载地址:https://github.c ...

  9. 关于makefile文件研究

    makefile文件采用依赖倒推的模式进行编译. 主要由以下几步构成: 1 申明 2 default 默认生成的对象 3 TARGET 链接过程 4 cpp 编译过程 5 生成一个version.h文 ...

  10. 采用MiniProfiler监控EF与.NET MVC项目

    今天来说说EF与MVC项目的性能检测和监控 首先,先介绍一下今天我们使用的工具吧. MiniProfiler~ 这个东西的介绍如下: MVC MiniProfiler是Stack Overflow团队 ...