后处理Bean也称之为Bean的后处理器,作用是:在Bean初始化的前后,对Bean对象进行增强。它既可以增强一个指定的Bean,也可以增强所有的Bean,底层很多功能(如AOP等)的实现都是基于它的,Spring可以在容器中直接识别调用。

【示例】

要对“所有”的bean的初始化的时候进行增强(打印一句话)

第一步:创建MyBeanPostProcessor类,实现接口BeanPostProcessor

//后处理bean,:用来对bean进行功能增强,可以实现,对所有,或某个bean的初始化进行增强

public class MyBeanPostProcessor implements BeanPostProcessor{

//初始化时(之前)调用的

//参数1:bean对象,参数2,bean的名字,id、name

public Object postProcessBeforeInitialization(Object bean, String beanName)

throws BeansException {

//     System.out.println(beanName+"在初始化前开始增强了");

//如何只增强一个bean

if(beanName.equals("lifeCycleBean")){

System.out.println(beanName+"在初始化前开始增强了");

}

return bean;//放行

}

//初始化时(之后)调用

public Object postProcessAfterInitialization(Object bean, String beanName)

throws BeansException {

//     System.out.println(beanName+"在初始化后开始增强了");

if(beanName.equals("lifeCycleBean")){

System.out.println(beanName+"在初始化后开始增强了");

}

return bean;

}

}

第二步:定义applicationContext.xml文件

<!-- 后处理bean:spring在初始化MyBeanPostProcessor的时候,判断是否实现了BeanPostProcessor,如果实现了,就采用动态代理的方式,对所有的bean对象增强 -->

<bean class="com.igeek.xmllifecycle.MyBeanPostProcessor"/>

执行任意bean操作的测试,控制台输出:

注意调用顺序。

BeanPostProcessor接口,提供增强途径,在不修改原来代码情况下,增添新的功能!

==========================================代码示例===============================================

bean1

public class Bean1 {public Bean1() {System.out.println("Bean1-无参数的构造方法");}public void method() {System.out.println("bean1 - method");}/*** 初始化方法, 方法名无所谓是什么* 主要用于初始化相关数据*/public void init() {System.out.println("初始化Bean1");}/*** 销毁Bean的方法,方法名无所谓* 主要用于释放资源*/public void destroy() {System.out.println("销毁方法,释放资源");}
}

bean2

public class Bean2 {public Bean2() {System.out.println("Bean2-无参数的构造方法");}public void method() {System.out.println("bean2 - method");}/*** 初始化方法, 方法名无所谓是什么* 主要用于初始化相关数据*/public void init() {System.out.println("初始化Bean2");}/*** 销毁Bean的方法,方法名无所谓* 主要用于释放资源*/public void destroy() {System.out.println("bean2销毁方法,释放资源");}
}

MyBeanPostProcessor 实现接口:

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
/*** Bean的后处理器* @author Administrator**/
public class MyBeanPostProcessor implements BeanPostProcessor {/*** bean对象被初始化之前执行的方法* @param bean 要处理的bean的对象* @param beanName 要处理的bean的名称或者ID*/@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println(beanName+"初始化之前增强");return bean;}/*** bean对象被初始化之后执行的方法* @param bean 要处理的bean的对象* @param beanName 要处理的bean的名称或者ID*/@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println(beanName+"初始化之后增强");return bean;}}

配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 默认使用无参数的构造放创建对象 -->
<!-- Bean的生命周期 -->
<!--
过 init-method属性 指定初始化后的调用方法
通过 destroy-method属性 指定销毁对象前的方法 -->
<bean id="bean1" class="com.igeek.Bean1" scope="singleton" init-method="init" destroy-method="destroy"/>
<bean id="bean2" class="com.igeek.Bean2" scope="singleton" init-method="init" destroy-method="destroy"/><!-- 配置后置处理Bean -->
<bean class="com.igeek.MyBeanPostProcessor"/></beans>

test测试:

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class BeanTest {ClassPathXmlApplicationContext context = null;@Beforepublic void befor() {context = new ClassPathXmlApplicationContext("applicationContext.xml");}@Testpublic void getBean1() {Bean1 bean1 = context.getBean(Bean1.class);bean1.method();bean1 = context.getBean(Bean1.class);bean1.method();bean1 = context.getBean(Bean1.class);bean1.method();bean1 = context.getBean(Bean1.class);bean1.method();//销毁容器的时候,会执行bean的destroy方法。context.close();}
}

Spring后处理Bean(BeanPostProcessor 接口)Bean增强相关推荐

  1. Spring中的BeanPostProcessor接口

    由方法名字也可以看出,前者在实例化及依赖注入完成后.在任何初始化代码(比如配置文件中的init-method)调用之前调用:后者在初始化代码调用之后调用. 注意: 1.接口中的两个方法都要将传入的be ...

  2. 【小家Spring】注意BeanPostProcessor启动时对依赖Bean的“误伤”陷阱(is not eligible for getting processed by all...)

    每篇一句 祝大家五一国际劳动节快乐~你是在快乐的撸码,还是在快乐的浪呢? 本文已被https://yourbatman.cn收录:程序员专用网盘https://wangpan.yourbatman.c ...

  3. Spring IOC详解 以及 Bean生命周期详细过程 可以硬刚面试官的文章

    面试题 来自面试官发自灵魂深处的拷问:谈谈你对spring的理解: 一脸懵逼的求职者的内心活动:啥?  具体的问题是什么?现在的面试都不按套路出牌了吗?  抛出一个这么大的问题,你让我怎么回答? 一脸 ...

  4. 框架:Spring之Aware相关接口

    一.Aware相关接口 对于应用程序来说,应该尽量减少对Sping Api的耦合程度,然而有些时候为了运用Spring所提供的一些功能,有必要让Bean了解Spring容器对其进行管理的细节信息,如让 ...

  5. 使用BeanPostProcessor接口对受管Bean进行预处理

    有时候,我们希望在Spring IoC容器初始化受管Bean之前.属性设置之后对该Bean先做一些预处理,或者在容器销毁受管Bean之前自己释放资源.那么该如何实现呢?Spring IoC为我们提供了 ...

  6. Spring8:一些常用的Spring Bean扩展接口

    前言 Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心. Spring框架运用了非常多的设计模式,从整体上看,它的设计严格 ...

  7. java 扩展接口_详解常用的Spring Bean扩展接口

    前言 Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心. Spring框架运用了非常多的设计模式,从整体上看,它的设计严格 ...

  8. 通过Spring的BeanPostProcessor的 bean的后置处理器会拦截所有bean创建过程

    postProcessBeforeInitialization 在init方法之前调用 postProcessAfterInitialization 在init方法之后调用 package com.C ...

  9. Spring学习--实现 FactoryBean 接口在 Spring IOC 容器中配置 Bean

    Spring 中有两种类型的 bean , 一种是普通的 bean , 另一种是工厂 bean , 即 FactroyBean. 工厂 bean 跟普通 bean 不同 , 其返回的对象不是指定类的一 ...

最新文章

  1. Flask 启动配置
  2. 关于表单的java的程序_JAVA BOT程序模拟人类用户填写表单 并 发送
  3. modal ajax,在Modal中调用Vue.js AJAX
  4. [转]12款最佳Linux命令行终端工具
  5. mysql存json将utf8编码 去掉,MySQL对JSON类型UTF-8编码导致中文乱码探讨
  6. 2018百度之星度度熊学队列
  7. 写那么多年Java,还不知道啥是Java agent的必须看一下!
  8. 文献学习(part18)--Subspace Clustering
  9. lpsolve java_如何使用LpSolve在R中设置线性编程优化?
  10. 字幕滚动c语言程序,MFC实现字幕滚动效果
  11. WINDOWS用VS2010开发NPAPI插件步骤
  12. 荣耀手机安装谷歌框架_华为荣耀9青春版安装谷歌框架 无需Root 华为荣耀手机安装谷歌框架...
  13. php编程模块英文缩写_PHP版国家代码、缩写查询函数代码
  14. 26-TeamBuilding-团队建设
  15. HTTP协议相关的网络经典五层模型
  16. Linux Make(Makefile)由浅入深的学习与示例剖析
  17. 2021年2月8日 抖音直播后端开发实习面经
  18. 微信小程序:全局状态管理mobx-miniprogram、mobx-miniprogram-bindings
  19. 漫画APP开发前景浅析
  20. 3ds max中的物体对齐方式

热门文章

  1. 网页素材大宝库:20套精美的清爽风格图标素材
  2. JQuery常用方法一览【转】
  3. [原创]jQuery Validation范例
  4. MySQL数据库基本用法-查询
  5. 信息爆炸时代,对待信息的三种方式
  6. iOS in-app purchase详解
  7. [zoj]3575 Under Attack III
  8. Nginx 负载均衡和缓存服务实战
  9. 虚拟机安装VMware ESXi 6.7安装过程介绍
  10. IT 日语学习 2012 06