Spring后处理Bean(BeanPostProcessor 接口)Bean增强
后处理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增强相关推荐
- Spring中的BeanPostProcessor接口
由方法名字也可以看出,前者在实例化及依赖注入完成后.在任何初始化代码(比如配置文件中的init-method)调用之前调用:后者在初始化代码调用之后调用. 注意: 1.接口中的两个方法都要将传入的be ...
- 【小家Spring】注意BeanPostProcessor启动时对依赖Bean的“误伤”陷阱(is not eligible for getting processed by all...)
每篇一句 祝大家五一国际劳动节快乐~你是在快乐的撸码,还是在快乐的浪呢? 本文已被https://yourbatman.cn收录:程序员专用网盘https://wangpan.yourbatman.c ...
- Spring IOC详解 以及 Bean生命周期详细过程 可以硬刚面试官的文章
面试题 来自面试官发自灵魂深处的拷问:谈谈你对spring的理解: 一脸懵逼的求职者的内心活动:啥? 具体的问题是什么?现在的面试都不按套路出牌了吗? 抛出一个这么大的问题,你让我怎么回答? 一脸 ...
- 框架:Spring之Aware相关接口
一.Aware相关接口 对于应用程序来说,应该尽量减少对Sping Api的耦合程度,然而有些时候为了运用Spring所提供的一些功能,有必要让Bean了解Spring容器对其进行管理的细节信息,如让 ...
- 使用BeanPostProcessor接口对受管Bean进行预处理
有时候,我们希望在Spring IoC容器初始化受管Bean之前.属性设置之后对该Bean先做一些预处理,或者在容器销毁受管Bean之前自己释放资源.那么该如何实现呢?Spring IoC为我们提供了 ...
- Spring8:一些常用的Spring Bean扩展接口
前言 Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心. Spring框架运用了非常多的设计模式,从整体上看,它的设计严格 ...
- java 扩展接口_详解常用的Spring Bean扩展接口
前言 Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心. Spring框架运用了非常多的设计模式,从整体上看,它的设计严格 ...
- 通过Spring的BeanPostProcessor的 bean的后置处理器会拦截所有bean创建过程
postProcessBeforeInitialization 在init方法之前调用 postProcessAfterInitialization 在init方法之后调用 package com.C ...
- Spring学习--实现 FactoryBean 接口在 Spring IOC 容器中配置 Bean
Spring 中有两种类型的 bean , 一种是普通的 bean , 另一种是工厂 bean , 即 FactroyBean. 工厂 bean 跟普通 bean 不同 , 其返回的对象不是指定类的一 ...
最新文章
- Flask 启动配置
- 关于表单的java的程序_JAVA BOT程序模拟人类用户填写表单 并 发送
- modal ajax,在Modal中调用Vue.js AJAX
- [转]12款最佳Linux命令行终端工具
- mysql存json将utf8编码 去掉,MySQL对JSON类型UTF-8编码导致中文乱码探讨
- 2018百度之星度度熊学队列
- 写那么多年Java,还不知道啥是Java agent的必须看一下!
- 文献学习(part18)--Subspace Clustering
- lpsolve java_如何使用LpSolve在R中设置线性编程优化?
- 字幕滚动c语言程序,MFC实现字幕滚动效果
- WINDOWS用VS2010开发NPAPI插件步骤
- 荣耀手机安装谷歌框架_华为荣耀9青春版安装谷歌框架 无需Root 华为荣耀手机安装谷歌框架...
- php编程模块英文缩写_PHP版国家代码、缩写查询函数代码
- 26-TeamBuilding-团队建设
- HTTP协议相关的网络经典五层模型
- Linux Make(Makefile)由浅入深的学习与示例剖析
- 2021年2月8日 抖音直播后端开发实习面经
- 微信小程序:全局状态管理mobx-miniprogram、mobx-miniprogram-bindings
- 漫画APP开发前景浅析
- 3ds max中的物体对齐方式