Spring的后置处理器(BeanFactoryPostProcessor和BeanPostProcessor)

java spring web项目 BeanFactoryPostProcessor和BeanPostProcessor介绍、应用场景 阅读详情

主要区别就是: BeanFactoryPostProcessor可以修改BEAN的配置信息而BeanPostProcessor不能,下面举个例子说明

BEAN类:  

package com.springdemo.postProcessor;

public class PostProcessorBean {
	private String username;
	
	private String password;

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}
}


MyBeanPostProcessor类,实现了BeanPostProcessor接口:

package com.springdemo.postProcessor;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

import com.springdemo.form.LoginForm;

public class MyBeanPostProcessor implements BeanPostProcessor {

	
	
	public Object postProcessAfterInitialization(Object bean, String beanName)
			throws BeansException {
		// TODO Auto-generated method stub
		//如果是PostProcessorBean则username信息
		if(bean instanceof PostProcessorBean)
		{
			System.out.println("PostProcessorBean Bean initialized");
			PostProcessorBean pb = (PostProcessorBean)bean;
			
			System.out.println("username:"+pb.getUsername());
		}
		return bean;
	}

	public Object postProcessBeforeInitialization(Object bean, String beanName)
			throws BeansException {
		// TODO Auto-generated method stub
		if(bean instanceof PostProcessorBean)
		{
			System.out.println("PostProcessorBean Bean initializing");
			PostProcessorBean pb = (PostProcessorBean)bean;
			
			System.out.println("username:"+pb.getUsername());
		}
		return bean;
	}

}


MyBeanFactoryPostProcessor实现了BeanFactoryPostProcessor接口:

[java]
package com.springdemo.postProcessor;

import org.springframework.beans.BeansException;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
			throws BeansException {
		// TODO Auto-generated method stub
		//BeanFactoryPostProcessor可以修改BEAN的配置信息而BeanPostProcessor不能
		//我们在这里修改postProcessorBean的username注入属性
		BeanDefinition bd = beanFactory.getBeanDefinition("postProcessorBean");
		MutablePropertyValues pv =  bd.getPropertyValues();
		if(pv.contains("username"))
		{
			pv.addPropertyValue("username", "xiaojun");
		}
		
	}

}


编写测试用例:  

package com.springdemo.test;


import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.springdemo.factory.ApplicationContextFactory;

import com.springdemo.postProcessor.PostProcessorBean;

import junit.framework.TestCase;

public class BeanPostPorcessorTest extends TestCase {
	private ApplicationContext context;
	protected void setUp() throws Exception {
		super.setUp();
		String[] paths = {"classpath*:/spring/applicationContext-*.xml"};

		context = new ClassPathXmlApplicationContext(paths);
		
	}

	protected void tearDown() throws Exception {
		super.tearDown();
	}
	
	public void testBeanPostProcessor()
	{
		
	}
	public void testBeanFactoryPostProcessor()
	{
		//PostProcessorBean bean =(PostProcessorBean)ServiceLocator.getService("postProcessorBean");
		PostProcessorBean bean =(PostProcessorBean)context.getBean("postProcessorBean");
		System.out.println("---------------testBeanFactoryPostProcessor----------------");
		System.out.println("username:"+bean.getUsername());
		System.out.println("password:"+bean.getPassword());
		//
	}
}


spring配置文件如下(先不启用MyBeanFactoryPostProcessor): 

<?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-2.0.xsd">
	
	<bean class="com.springdemo.postProcessor.MyBeanPostProcessor"></bean>
	<!--我们先把BeanFactoryPostProcessor注释掉,不启用,然后查看测试输出结果  
	<bean class="com.springdemo.postProcessor.MyBeanFactoryPostProcessor"></bean>
	-->
	<bean id="postProcessorBean" class="com.springdemo.postProcessor.PostProcessorBean" >
		<property name="username" value="test"></property>
		<property name="password" value="test"></property>
	</bean>
</beans>


测试输出结果如下:

PostProcessorBean Bean initializing
username:test
PostProcessorBean Bean initialized
username:test
---------------testBeanFactoryPostProcessor----------------
username:test
password:test

然后我们取消注释启用MyBeanFactoryPostProcessor,测试结果如下:

PostProcessorBean Bean initializing
username:xiaojun
PostProcessorBean Bean initialized
username:xiaojun
---------------testBeanFactoryPostProcessor----------------
username:xiaojun
password:test

从结果可以看出:BeanFactoryPostProcessor的回调比BeanPostProcessor要早,因为BeanPostProcess中输出的username已经变成了xiaojun,而不是test.还有就是BeanFactoryPostProcessor确实有能力改变初始化BEAN的内容,您可以试试在MyBeanPostProcess中试一试set一下username看看能不能改变BEAN实例的内容(答案应该是否定的).

 

转载自:http://blog.youkuaiyun.com/xiao_jun_0820/article/details/7242379

大疆 2021 嵌入式笔试题 在深圳做嵌入式,大疆公司绝对是 Top 级别的,大疆的技术栈也很深。 阅读详情

相关推荐

[Pytorch案例实践001]手写MNIST数字识别

Pytorch实现手写数字识别,带完整数据集。

2403_83044722的博客 1117

Spring中那些BeanFactoryPostProcessors详解(一)

本文是对[Spring中refresh分析之invokeBeanFactoryPostProcessors方法详解](https://blog.youkuaiyun.com/J080624/article/details/54345467)的一个补充,我们详细说明一下那些BeanFactoryPostProcessor在invokeBeanFactoryPostProcessors方法中的作用。 # 【1】CachingMetadataReaderFactoryPostProcessor `CachingMetad

小小默:进无止境 2674

AI 边缘计算控制器GEAC91

AI 边缘计算控制器GEAC91是AI边缘计算控制器是一款基于 NVIDIA Jetson AGX Xavier处理 器、面向智能边缘计算应用场景的解决方案。

weixin_45905610的博客 1200

BeanFactoryPostProcessor与BeanPostProcessor的区别

1.作用不同 BeanFacotoryPostProcessor 允许我们在实例化bean之前(在调用bean的构造函数创建对象之前执行)拿到bean定义信息,然后修改它,比如可以修改bean的属性值,或者往容器中注入一些其他的bean定义信息 BeanPostProcessor 允许我们在bean初始化之前、或者初始化之后,修改bean实例信息,比如生成bean的动态代理对象 2.接口方法不同 BeanFacotoryPostProcessor public interface Bean

kykangyuky的博客 1030

电赛备赛笔记:用STM32驱动AD9959信号发生器模块,从接线到出波保姆级教程

本文详细介绍了如何使用STM32驱动AD9959信号发生器模块,从硬件接线到软件调试的全流程。AD9959作为高性能DDS芯片,适用于电子设计竞赛中的信号生成需求。文章包含硬件连接指南、寄存器配置解析、多通道控制技巧以及常见问题解决方案,帮助参赛者快速掌握AD9959的应用。

weixin_31858171的博客 368

CATIA_DELMIA_V5R2019安装包下载及安装教程破解

CATIA_V5R2019/DELMIA_V5R2019安装包下载及安装教程破解

一只机械工装熊的博客 8391

Spring系列之BeanPostProcessor和BeanFactoryPostProcessor区别

Spring提供了两种后处理bean的扩展接口,分别为BeanPostProcessor和BeanFactoryPostProcessor,这两者在使用上是有所区别的。 BeanPostProcessor:bean级别的处理,针对某个具体的bean进行处理 接口提供了两个方法,分别是初始化前和初始化后执行方法,具体这个初始化方法指的是什么方法,类似我们在定义bean时,定义了init-method所指定的方法<bean id = "xxx" class = "xxx" init-method

Turn X7 4047

软件测试工程师笔试题

这里写目录标题全套软件测试面试笔试题(附答案)二、选折三、添空四、简答(资料是搜集整理的,感谢前辈的解题)无1.区别阶段评审的与同行评审2.什么是软件测试3. 简述集成测试的过程4 怎么做好文档测试5 白盒测试有几种方法6 系统测试计划是否需要同行审批,为什么7Alpha 测试与 beta 的区别8 比较负载测试,容量测试和强度测试的区别。性能测试从使用方便的角度来说,9 测试结束的标准是什么?10 描述软件测试活动的生命周期?11 软件的缺陷等级应如何划分? 软件测试工程师笔试题(附答案) 全套软件测试面

m0_46446002的博客 2549

Spring经典扩展接口应用:BeanFactoryPostProcessor

对BeanFactoryPostProcessor基本知识总结,并给出框架中的应用举例分析,再次给出扩展应用代码举例和一些建议,最后简单分析对应的源码分析

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 6万+

基于matlab目标雷达横截面建模(附源码)

雷达系统依靠目标反射或散射来检测和识别目标。目标反射越强,雷达接收器返回的回波就越大,从而获得更高的信噪比(SNR)和更高的检测可能性。在雷达系统中,从目标反射的能量由雷达横截面(RCS)决定,定义为sigma代表RCS,R是雷达与目标之间的距离,Es是从目标反射的信号的场强,以及Ei是入射到目标上的信号的场强。通常,目标向各个方向散射能量,RCS是入射角,散射角和信号频率的函数。RCS 取决于目标的形状和构建目标的材料。用于RCS的常用单位包括平方米或dBsm。

珞瑜的博客 3085

HandwrittenMathFormulaRecognition:基于YOLOv8的手写数学公式识别系统

输入:包含手写数学公式的图像(拍摄的板书、作业纸等)输出:对应的数字文本形式的数学公式(如LaTeX格式或文本表达式)标准的手写数学表达式数据集,包含在线轨迹及图片,广泛用于公式识别研究。包含近10万对公式图片及对应的LaTeX标注,适合训练公式识别模型。MathBrush公开手写数学公式图像数据集,含多种书写风格。手写数字与符号数据集(MNIST及其扩展)用于基础数学符号的训练。

YOLO 283

Spring系列 什么是Bean后置处理器?(超通俗易懂)

Spring Bean后处理器是Spring框架提供的一种**扩展机制**,划重点:**扩展机制**。用于再Spring容器实例化、配置和初始化Bean的过程中,添加自定义逻辑。(大白话:后处理器是可以在Bean的生命周期的不同阶段 进行干预,可以对Bean进行修改、增强或者执行其他操作。开发者只要去实现,Spring当中的BeanPostProcessor接口,那么就能插手SpringBean实例化的一个过程)

weixin_45663027的博客 1566

YOLOv13改进策略【特征提取层】| 引入注意力卷积模块RFAConv,关注感受野空间特征 助力yolov13精度提升

RFAConv:创新空间注意力和标准卷积运算感受野空间特征是针对卷积核设计的,根据卷积核大小动态生成。以3×3卷积核为例,它由非重叠滑动窗口组成,每个窗口代表一个感受野滑块。

Limiiiing的博客 363

Spring后置处理器BeanFactoryPostProcessor与BeanPostProcessor源码解析

Spring有两种类型的后置处理器,分别是和,这里再贴出我画的 Spring 启动过程,可以看看这两种后置处理器在 Spring 启动过程中位置。总结一下执行顺序先执行了的方法,按照顺序Ordered> 其他;再执行了的方法;最后执行的方法,按照顺序Ordered> 其他;

dongdong199033的博客 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Spring后置处理器(BeanPostProcessor)(BeanFactoryPostProcessor)

Spring的后置处理器,在应用Spring框架开发中非常重要,Spring底层的核心,就通过各种后置处理器去完成IOC容器的启动,AOP代理对象的创建。 Spring的后置处理器有两大类,BeanFactory与Bean。 BeanFactory Bean 工厂方面的后置处理器 BeanFactoryPostProcessor 获取IOC容器 BeanDefinitionRegistryPostProcessor 向容器注册Bean ...

liuqi199707的博客 573

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

spring 后置处理器BeanFactoryPostProcessor和BeanPostProcessor的用法和区别

主要区别就是:BeanFactoryPostProcessor可以修改BEAN的配置信息而BeanPostProcessor不能,下面举个例子说明 BEAN类: [java] view plaincopy packagecom.springdemo.postProcessor; publicclassPostProcessorBean{ ...

weixin_30698297的博客 89

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

关于Spring的Aware接口和后置处理器接口(BeanPostProcessor和BeanFactoryPostProcessor)的一些想法

看了关于Aware接口和后置处理器接口(BeanPostProcessor和BeanFactoryPostProcessor),感觉他们之间的功能有点乱,说一下他们之间的区别: (1)从调用时间点上看,Aware接口的方法(都是setXXX方法)是在Bean的属性被设置之后,初始化方法初始化方法(InitializingBean接口的方法,或@PostContruct等)执行之前被调用;Bean

冲吧,不要停! 2326

spring后置处理器

1. BeanPostProcessor bean的后置处理器,主要在bean初始化前后工作。接口定义: public interface BeanPostProcessor { // 在初始化方法(如:afterPropertiesSet 或 init-method)执行前触发 @Nullable default Object postProcessBeforeInitializatio...

u013376634的博客 7208

Java-33 深入浅出 Spring - FactoryBean 和 BeanFactory BeanPostProcessor

BeanFactory 接口是容器的顶级接口,定义了容器的一些基础行为,负责生产和管理 Bean 的一个工厂,具体使用它下面的子接口类型,比如 ApplicationContext,此处我们重点分析:FactoryBeanSpring 中 Bean 有两种,一种普通 Bean,一种是工厂 Bean(FactoryBean),FactoryBean 可以生成某一个类型的对象实例,也就是我们可以借助它来自定义 Bean 的创建过程。

谢谢你的喜欢 我们一起无限进步 3726

Spring的BeanFactoryPostProcessor和BeanPostProcessor区别

使用者可以通过实现BeanFactoryPostProcessor、BeanPostProcessor两个接口,处理初始化过程的bean。 一、BeanFactoryPostProcessor 该接口源码如下: public interface BeanFactoryPostProcessor { //可以通过beanFactory获取bean定义信息 void postProcessBea......

欢迎来到【战羽】的博客 1万+
上一篇: JPA(Java Persistence API)Java持久化API-应用
下一篇: Spring3.1.2 提供的类型转换支持
努力突破
博客等级 码龄17年 36粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值