如果实现了BeanFactoryPostProcessor接口,则@PostConstruct和@PreDestroy和@Value将不起作用

如果实现了BeanFactoryPostProcessor接口,则@PostConstruct和@PreDestroy和@Value将不起作用

如果实现了BeanFactoryPostProcessor接口,则@PostConstruct和@PreDestroy和@Value将不起作用







BeanFactoryPostProcessor

BeanFactoryPostProcessor是Spring框架中的一个接口,用于在BeanFactory实例化和配置bean之前对BeanFactory进行后置处理。它允许开发人员在Spring容器加载bean定义文件并实例化bean之前修改BeanFactory的行为。

BeanFactoryPostProcessor接口有一个方法postProcessBeanFactory,该方法在Spring容器加载bean定义文件之后,但在实例化和配置bean之前被调用。在这个方法中,开发人员可以对BeanFactory进行任何必要的修改,例如添加或删除bean定义,修改bean的属性等。

以下是一个示例,演示了如何实现BeanFactoryPostProcessor接口并使用postProcessBeanFactory方法来修改BeanFactory的行为:

import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {// 在这里可以对BeanFactory进行修改// 例如添加或删除bean定义,修改bean的属性等}
}

在上面的示例中,我们创建了一个名为MyBeanFactoryPostProcessor的类,实现了BeanFactoryPostProcessor接口,并重写了postProcessBeanFactory方法。在这个方法中,我们可以根据需要对BeanFactory进行修改。

注意:BeanFactoryPostProcessor的执行顺序是在BeanPostProcessor之前。

BeanFactoryPostProcessor是Spring框架中的一个重要接口,它允许我们在Spring的IoC容器准备好之后,但在bean实例化之前,对bean的定义进行自定义修改。这个接口的实现类可以访问和修改容器中bean的属性、元数据甚至是整个bean定义。

当Spring IoC容器读取了所有的bean配置信息,并且将这些信息存储到BeanDefinitionRegistry中后,它会初始化所有的BeanFactoryPostProcessor。然后,这些BeanFactoryPostProcessor就可以按照它们自己的逻辑去修改存储在容器中的bean定义了。

典型的BeanFactoryPostProcessor实现包括PropertyPlaceholderConfigurer,它用于处理占位符并替换为实际的属性值。

BeanFactoryPostProcessor的工作流程大致如下:

  1. 容器创建BeanFactoryPostProcessor实例。
  2. 容器调用BeanFactoryPostProcessorpostProcessBeanFactory方法。
  3. postProcessBeanFactory方法中,开发者可以获取到ConfigurableListableBeanFactory,并对bean定义进行自定义的修改。

需要注意的是,BeanFactoryPostProcessor是对整个Spring容器的bean定义进行修改,而BeanPostProcessor则是对单个bean实例进行初始化前和初始化后的处理。这两者虽然名字相似,但处理的对象和时机是不同的。

此外,关于@PostConstruct@PreDestroy注解在BeanFactoryPostProcessor实现类中的使用,通常这些注解是用于处理单个bean实例的生命周期回调的。而BeanFactoryPostProcessor处理的是bean定义,因此在BeanFactoryPostProcessor实现类中使用这些注解可能没有意义,因为此时还没有bean实例被创建。

如果你需要在BeanFactoryPostProcessor执行之后进行一些初始化操作,可以考虑使用InitializingBean接口和它的afterPropertiesSet方法,或者简单地使用一个初始化的@Bean方法,在这个方法中执行所需的操作。然而,这些方法仍然是在bean实例层面上的,而不是在bean定义层面上。如果你真的需要在bean定义被修改后执行某些操作,你可能需要自定义一个BeanFactoryPostProcessor并在postProcessBeanFactory方法中直接执行这些操作。







BeanFactoryPostProcessor 和 BeanPostProcessor 的区别

BeanFactoryPostProcessorBeanPostProcessor都是Spring框架中用于扩展和自定义bean处理的接口,但它们在处理时机和处理内容上有所不同。

  1. 处理时机:

    • BeanFactoryPostProcessor:在Spring IoC容器初始化之后,但在bean实例化之前调用。这意味着所有的bean定义已经被加载到BeanFactory中,但尚未创建bean的实例。BeanFactoryPostProcessor允许你访问和修改存储在容器中的bean定义。
    • BeanPostProcessor:在bean实例化之后,但在bean的初始化方法(如@PostConstruct注解的方法或实现了InitializingBean接口的afterPropertiesSet方法)之前和之后调用。它允许你对已经实例化的bean对象进行修改或包装。
  2. 处理内容:

    • BeanFactoryPostProcessor:主要处理bean的定义(配置元数据),比如修改bean的属性值或向容器中注入其他的bean定义信息。它提供了对整个BeanFactory的访问,并可以对其中的bean定义进行全局的修改。
    • BeanPostProcessor:主要处理bean实例,可以在bean初始化前后对其进行操作,比如生成bean的动态代理对象、修改bean的属性等。它是针对每个bean实例逐一处理的。
  3. 典型用途:

    • BeanFactoryPostProcessor:典型的用途包括配置占位符的替换(如PropertyPlaceholderConfigurer)、向容器中添加或覆盖bean定义等。
    • BeanPostProcessor:典型的用途包括自动装配、AOP代理的创建、检查bean属性的合法性等。
  4. 注册和使用:

    • BeanFactoryPostProcessor:需要实现postProcessBeanFactory方法,并通过Spring配置文件或注解方式将其注册为Spring bean。Spring容器会自动调用所有注册的BeanFactoryPostProcessor实例的postProcessBeanFactory方法。
    • BeanPostProcessor:需要实现postProcessBeforeInitialization和/或postProcessAfterInitialization方法,并通过Spring配置文件或注解方式将其注册为Spring bean。每当容器创建一个bean实例时,都会自动调用这些方法来执行自定义逻辑。

BeanFactoryPostProcessor和BeanPostProcessor是Spring框架中用于对Bean进行后处理的两个接口,它们在使用上有以下区别:

  1. 作用对象不同:

    • BeanFactoryPostProcessor是对整个Bean工厂进行处理的,可以在Bean实例化之前修改Bean的定义或配置。
    • BeanPostProcessor是对每个Bean实例进行处理的,可以在Bean实例化后、依赖注入之前或之后对Bean进行修改。
  2. 执行顺序不同:

    • BeanFactoryPostProcessor在Bean实例化之前执行,用于修改Bean的定义或配置。
    • BeanPostProcessor在Bean实例化后、依赖注入之前或之后执行,用于对Bean进行增强或修改。
  3. 功能不同:

    • BeanFactoryPostProcessor可以修改Bean的定义或配置,例如修改Bean的属性值、添加新的Bean定义等。
    • BeanPostProcessor可以对Bean进行增强或修改,例如在Bean实例化后添加额外的逻辑、修改Bean的属性值等。

总结起来,BeanFactoryPostProcessor是对整个Bean工厂进行处理的,用于修改Bean的定义或配置;而BeanPostProcessor是对每个Bean实例进行处理的,用于对Bean进行增强或修改。







测试代码1
package z24dec.msbtLifeCycle;import static java.lang.System.out;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.*;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.*;import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;@Component
@Configuration
public class LifeCycleTest2403110139 implements BeanNameAware, BeanFactoryAware
//, BeanFactoryPostProcessor
//, BeanPostProcessor
//, InstantiationAwareBeanPostProcessor   //  public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor 
, InitializingBean
, DisposableBean
{public static void pln(Object o) {out.println(o);}public LifeCycleTest2403110139() {pln(this.getClass().getName() +  "的构造方法");}private Object property001;public Object getProperty001() {return property001;}@Value("${property001:默认值} ABC abc 👆👇👈👉 Hello World 你好世界")public void setProperty001(Object property001) {this.property001 = property001.toString();pln(this.getClass().getName() +  "的成员变量(属性)的SETTER方法");}@Overridepublic void setBeanName(String name) {pln(this.getClass().getName() +  "实现BeanNameAware接口的setBeanName(String name)方法, name="+name);}@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {pln(this.getClass().getName() +  "实现BeanFactoryAware接口的setBeanFactory(BeanFactory beanFactory)方法, beanFactory="+beanFactory);}//	@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {pln(this.getClass().getName() +  "实现BeanPostProcessor接口的postProcessBeforeInitialization(Object bean, String beanName)方法, bean=" + bean + "   ,   beanName="+beanName);
//		return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);return null;}public void 业务方法010() {pln(this.getClass().getName() +  "的业务方法010");}//	@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {pln(this.getClass().getName() +  "实现BeanPostProcessor接口的postProcessAfterInitialization(Object bean, String beanName)方法, bean=" + bean + "   ,   beanName="+beanName);
//		return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);return null;}@PostConstruct    // 如果实现了BeanFactoryPostProcessor, 则@PostConstruct不起作用void postConstruct() {pln(this.getClass().getName() +  "的添加了@PostConstruct的方法");}@Overridepublic void afterPropertiesSet() throws Exception {pln(this.getClass().getName() +  "实现InitializingBean接口的afterPropertiesSet()方法, 无参");}@PreDestroy    // 如果实现了BeanFactoryPostProcessor, 则@PreDestroy不起作用public void preDestroy() {pln(this.getClass().getName() +  "的添加了@PreDestroy的方法");}public void destroy() throws Exception {pln(this.getClass().getName() +  "实现DisposableBean接口的destroy()方法, 无参");}public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {pln(this.getClass().getName() +  "实现BeanFactoryPostProcessor接口的postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)方法, beanFactory="+beanFactory);}}













本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/736779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】Linux内核pci_read_config_和pci_write_config_

一、pci_read_config_讲解 这些函数是Linux内核中用于从PCI设备的配置空间读取信息的函数。配置空间是PCI设备的一小块内存,它存储了关于该设备的重要信息,例如设备ID、供应商ID、中断设置等。 pci_read_config_byte、pci_read_config_word、pci_read_c…

算法刷题day27:日期问题

目录 引言概念一、日期差值二、日期问题三、回文日期 I四、回文日期 II五、日期计算 引言 日期问题在蓝桥杯中只要把常见的题型掌握明白了,把逻辑给写清楚明白,基本上是很简单的,再就是多做题,题型多见,做熟练&#x…

章六、集合(1)—— 概念、API、List 接口及实现类、集合迭代

零、 关闭IDEA调试时自动隐藏空元素 一、 集合的概念 存储一个班学员信息,假定一个班容纳20名学员 当我们需要保存一组一样(类型相同)的元素的时候,我们应该使用一个容器来存储,数组就是这样一个容器。 数组有什么缺…

记录一下el-table的tooltip换行

一些需求场景下,需要保持el-table中tooltip出现的时机,并且当前代码编写时完全不能通过js控制tooltip禁用属性时,可以通过以下方法实现tooltip换行。 1、对应单元格的 showOverflowTooltip 属性设置为true,tooltip出现时机依然使…

一文读懂:公网IP地址证书

公网IP证书是一种SSL证书,用于验证和确认特定的公网IP地址是否实际属于申请者。如果验证通过,证书颁发机构将向该IP地址持有人颁发一个以IP地址为主题的SSL证书。使用公网IP证书可以有效提升IP身份的辨识度,减少网站链接被假冒的风险&#xf…

学会这7种SQL进阶用法,让你少走99%的弯路!

引言 在日常业务开发中,熟练掌握SQL语言是至关重要的。除了基础的增删改查操作外,了解和掌握一些进阶的SQL用法能够让你更高效地处理各种复杂的数据操作。本文将介绍几种SQL进阶用法,让你少走99%的弯路,提高数据处理效率。 自定…

【Idea】八种Debug模式介绍

1.行断点 在对应的代码行左侧边栏点击鼠标左键,会出现一个红色圆圈,以debug模式执行时当代码运行到此处则会停止,并可以查询相关上下文参数 2.方法断点 在方法左侧点击创建断点,在方法进入时会停止,同时可以右键断点,…

vite vue3 路由配置@找不到文件问题描述

问题描述 在vite.config.js文件中配置路由的时候,添加路由界面,找不到指定的文件,提示错误,如图所示: 但是换成 ./ 或者 ../ 就正常了,也没有报错问题 解决办法 1.安装一个path的插件 npm install --sav…

风车IM即时通讯系统APP源码DJ2403版完整苹果安卓教程

关于风车IM,你在互联网上能随便下载到了基本都是残缺品, 经过我们不懈努力最终提供性价比最高,最完美的版本, 懂货的朋友可以直接下载该版本使用,经过严格测试,该版本基本完美无缺。 1.宝塔环境如下: Ngin…

第二十四章 跨域

一、跨域 1. 什么是跨域 跨域,是指当前浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制。跨域问题也可以具体描述为:请求方使用XMLHttpRequest请求没有遵守同源策略且没有设置CORS规则的被…

什么是Git引用和分支?

一. 引言 什么是Git引用和分支?比如我在 Github 上一个项目的 .git/refs目录下: ├─heads │ dev │ master │ ├─remotes │ └─origin │ master │ └─tags refs 目录下包含了 heads、remote、tags 三个子目录&#xff0…

openCV制作九宫格图片

我想将任意九张图片按照九宫格排列方式合并成一张大图,使用openCV实现。 如果用画图工具来实现的话,需要事先准备一个600 X 600像素的画布。用openCV实现也是同理,准备一张600 X 600的图片。然后将图片划分成9份,每一份替换成小图…

《Ubuntu20.04环境下的ROS进阶学习0》

一、逛ROS应用商店 在上一专栏http://t.csdnimg.cn/oGlcu,我们了解了ROS的基本功能。这一专栏将会在此基础上做出进一步拓展学习。那么首先我们要学会下载并阅读别人的代码。常用的两个应用商店一个是ROS的官方应用商店ROS index,另一个就是我们熟知的gi…

11---数字温度 OR 湿度传感器电路设计

视频链接 数字温度or湿度传感器电路设计02_哔哩哔哩_bilibili 数字温度 OR 湿度传感器电路设计 1、温湿度传感器 DHT11 DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度-5%RH, 温度-2℃,量程湿度20-90%RH, 温度0~50℃。 D…

MySQL临时表创建出错(OS errno 13 - Permission denied)

一个客户向我抱怨:在MySQL查询小表没有问题,查询大表出错,下面是他发给我的出错的部分截屏(客户的表名被我隐藏了)。 这里的给出的信息已经比较明显了,是向/tmp目录中创建临时表失败(临时表的路…

【嵌入式——QT】Splash与登录窗口

一般的大型应用程序在启动时会显示一个启动画面,即Splash窗口,Splash窗口是一个无边对话框,一般显示一个图片,展示软件信息,Splash窗口显示时,程序在后台做一些比较耗时的启动准备工作,Splash窗…

《腾讯音乐》24校招Java后端一面面经

1.手写LRU 2.项目拷打 3.Https客户端校验证书的细节? 4.对称加密和非对称加密的区别?你分别了解哪些算法? 5.在信息传输过程中,Https用的是对称加密还是非对称加密? 6.怎么防止下载的文件被劫持和篡改? 7.H…

linux进程间通信-信号量

Linux c/c之IPC进程间通信 Linux - 进程间通信之信号量

Websocket在Asp.net webApi(.net framework)上的应用

之前在写看板部分的web api的时候,都是通过Ajax在规定时间内轮询调用web api,这样简单省事,但是当看板多了(并发量上来)以后,比较消耗服务器的性能,所以最近研究了websocket,希望使用…

【机器学习】决策树系统 | 决策树基本原理,最优划分属性,剪枝处理

文章目录 1 基本原理2 最优划分属性选择2.1 信息增益选择最优属性方法2.2 信息增益率选择最优属性方法——C4.5决策树2.3 基尼指数选择最优属性——CART决策树 3 剪枝处理3.1 预剪枝3.2 后剪枝 决策树是一种常用的机器学习算法,它模拟了人类决策过程中的思考方式。想…