java:spring使用【XXXPostProcessor】添加bean定义,修改bean定义、代理bean

# 项目代码资源:

可能还在审核中,请等待。。。
https://download.csdn.net/download/chenhz2284/89433361

# 项目代码

【pom.xml】

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.3.12.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId><version>2.3.12.RELEASE</version>
</dependency>
<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.11</version>
</dependency>

【application.properties】

server.port=8080
spring.application.name=myBeanMainmanagement.server.port=7001
management.endpoints.web.exposure.include=*

【IMainBean4.java】

package com.chz.myBeanMain.bean;public interface IMainBean4
{String getName();
}

【MainBean1.java】

package com.chz.myBeanMain.bean;@Slf4j
@Getter
@Setter
@Component
public class MainBean1 {public MainBean1(){log.info("chz >>> MainBean1.<init>()");}private String name = "MainBean1";
}

【MainBean2.java】

package com.chz.myBeanMain.bean;@Slf4j
@Getter
@Setter
// @Component   // 注意没有注解
public class MainBean2 {public MainBean2(){log.info("chz >>> MainBean2.<init>()");}private String name = "MainBean2";
}

【MainBean3.java】

package com.chz.myBeanMain.bean;@Slf4j
@Getter
@Setter
// @Component   // 注意没有注解
public class MainBean3 {public MainBean3(){log.info("chz >>> MainBean3.<init>()");}private String name = "MainBean3";
}

【MainBean4.java】

package com.chz.myBeanMain.bean;@Slf4j
@Getter
@Setter
@Component
public class MainBean4 implements IMainBean4 {public MainBean4(){log.info("chz >>> MainBean4.<init>()");}private String name = "MainBean4";
}

【MainBean4Proxy.java】

package com.chz.myBeanMain.bean;public class MainBean4Proxy implements IMainBean4{private MainBean4 mainBean4;public MainBean4Proxy(MainBean4 mainBean4){this.mainBean4 = mainBean4;}@Overridepublic String getName() {return "[我被代理了:"+ mainBean4.getName()+"]";}
}

【MainController.java】

package com.chz.myBeanMain.controller;@Slf4j
@RestController
@RequestMapping("/main")
public class MainController {@Autowired(required = false)private MainBean1 mainBean1;@Autowired(required = false)private MainBean2 mainBean2;@Autowired(required = false)private MainBean3 mainBean3;@Autowired(required = false)private IMainBean4 mainBean4;@GetMapping("/mainBean1")public String mainBean1() {return "mainBean1: " + mainBean1.getName();}@GetMapping("/mainBean2")public String mainBean2() {return "mainBean2: " + mainBean2.getName();}@GetMapping("/mainBean3")public String mainBean3() {return "mainBean3: " + mainBean3.getName();}@GetMapping("/mainBean4")public String mainBean4() {return "mainBean4: " + mainBean4.getName();}
}

【MyBeanDefinitionRegistryPostProcessor.java】

package com.chz.myBeanMain.postProcessor;@Slf4j
@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor
{@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException{log.info("chz >>> MyBeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry():");// 修改bean的属性BeanDefinition mainBean1 = registry.getBeanDefinition("mainBean1");mainBean1.getPropertyValues().add("name", "[mainBean1 - 我被MyBeanDefinitionRegistryPostProcessor改了]");}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException{log.info("chz >>> MyBeanDefinitionRegistryPostProcessor.postProcessBeanFactory():");// 添加一个beanMainBean2 mainBean2 = new MainBean2();mainBean2.setName(mainBean2.getName() + " - 我是通过MyBeanDefinitionRegistryPostProcessor新加的bean");beanFactory.registerSingleton("mainBean2", mainBean2);}
}

【MyBeanFactoryPostProcessor.java】

package com.chz.myBeanMain.postProcessor;@Slf4j
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor
{@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException{log.info("chz >>> MyBeanFactoryPostProcessor.postProcessBeanFactory():");// 添加一个beanMainBean3 mainBean3 = new MainBean3();mainBean3.setName(mainBean3.getName() + " - 我是通过MyBeanFactoryPostProcessor新加的bean");beanFactory.registerSingleton("mainBean3", mainBean3);}
}

【MyBeanPostProcessor.java】

package com.chz.myBeanMain.postProcessor;@Slf4j
@Component
public class MyBeanPostProcessor implements BeanPostProcessor
{@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {log.info("chz >>> MyBeanPostProcessor.postProcessBeforeInitialization(): {}", beanName);return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException{log.info("chz >>> MyBeanPostProcessor.postProcessAfterInitialization(): {}", beanName);if( (bean instanceof IMainBean4) && !(bean instanceof MainBean4Proxy)){// 代码beanbean = new MainBean4Proxy((MainBean4)bean);}return bean;}
}

【MyBeanMainTest.java】

package com.chz.myBeanMain;@SpringBootApplication
public class MyBeanMainTest {public static void main(String[] args) {SpringApplication.run(MyBeanMainTest.class, args);}
}

# 运行与测试

运行【MyBeanMainTest】,然后:
访问【http://localhost:8080/main/mainBean1】
在这里插入图片描述

访问【http://localhost:8080/main/mainBean2】
在这里插入图片描述
访问【http://localhost:8080/main/mainBean3】
在这里插入图片描述
访问【http://localhost:8080/main/mainBean4】
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

GaussDB技术解读——GaussDB架构介绍(三)

目录 9 智能关键技术方案 智能关键技术一&#xff1a;自治运维系统 智能关键技术二&#xff1a;库内AI引擎 智能关键技术三&#xff1a;智能优化器 10 驱动接口关键技术方案 GaussDB架构介绍&#xff08;二&#xff09;从数据持久化存取层(DataNode)关键技术方案、全局事…

list容器的基本使用

目录 前言一&#xff0c;list的介绍二&#xff0c;list的基本使用2.1 list的构造2.2 list迭代器的使用2.3 list的头插&#xff0c;头删&#xff0c;尾插和尾删2.4 list的插入和删除2.5 list 的 resize/swap/clear 前言 list中的接口比较多&#xff0c;与string和vector类似&am…

全面解说Facebook代投菲律宾真金游戏pwa广告全流程

全面解说Facebook代投菲律宾真金游戏pwa广告全流程 随着数字营销的不断发展&#xff0c;社交媒体平台如Facebook已成为广告主们争相投放的热门渠道。对于希望拓展菲律宾市场的真金游戏企业来说&#xff0c;了解并掌握在Facebook上投放广告的具体流程显得尤为重要。本文将详细介…

SQL SERVER触发器记录指定的几笔资料更新记录

1.目的 为了记录数据库表中资料数据动态的变更&#xff0c;实时动态且方便调整记录的范围。 2.分析 需求:记录UPDATE 修改的记录 if exists(select 1 from inserted) and exists(select 1 from deleted) &#xff1a;修改if (exists (select 1 from inserted) and n…

[Nacos]No spring.config.import property has been defined

在学习 Spring Cloud Alibaba &#xff0c;Nacos组件&#xff0c;创建一个cloudalibaba-config-nacos-client&#xff0c;加载多配置集时遇到问题 配置了 bootstrap.yml 后启动项目报错&#xff1a; 是因为在springcloud 2020.0.2版本中把bootstrap的相关依赖从spring-cloud-s…

电脑文件msvcr120.dll丢失怎样修复?具体的msvcr120.dll修复方法分享

电脑文件msvcr120.dll丢失是一种比较常见的现象&#xff0c;只要是经常使用电脑的人&#xff0c;那么遇到msvcr120.dll丢失的次数就越多&#xff0c;今天主要来给大家聊一下msvcr120.dll丢失的各种解决方法。 一.电脑文件msvcr120.dll msvcr120.dl是由Microsoft提供的关键系统…

Qt飞机大战小游戏

Gitee地址 &#xff1a;plane-game: 基于Qt的飞机大战小游戏 GitHub地址&#xff1a; https://github.com/a-mo-xi-wei/plane-game

微信鸿蒙版本来了 我不允许你不会

前言: 各位同学大家好, 好久没有更新鸿蒙文章了 现在更新一个鸿蒙版本高仿微信版本 那么废话不多说 我们正式开始 作者:徐庆 团队:坚果派 公众号:“大前端之旅” 润开鸿生态技术专家,华为HDE,CSDN博客专家,CSDN超级个体,CSDN特邀嘉宾,InfoQ签约作者,OpenHarmony布…

2024牛客网高频精选Java面试八股文整理(附答案)

Java 面试 Java 作为编程语言中的 NO.1,选择入行做 IT 做编程开发的人&#xff0c;基本都把它作为首选语言,进大厂拿高薪也是大多数小伙伴们的梦想。以前 Java 岗位人才的空缺&#xff0c;而需求量又大&#xff0c;所以这种人才供不应求的现状&#xff0c;就是 Java 工程师的薪…

【CH32V305FBP6】USBD HS 描述符修改

文章目录 前言设备描述符配置描述符配置描述符CDC 描述符接口关联描述符接口描述符功能描述符端点描述符接口描述符端点描述符 HID 描述符接口描述符 练习&#xff1a;新增一个 HID 设备 前言 USB HS 复合设备&#xff0c;CDCHID 功能&#xff1a;串口、DAP、CAN-HID、RS485 …

健身小程序:智能化助力个人健身旅程

一、智能化功能的核心 健身小程序的智能化功能主要体现在以下几个方面&#xff1a; 智能健身计划推荐&#xff1a;小程序内置了先进的算法&#xff0c;能够根据用户的身体状况、健身目标和时间安排&#xff0c;智能推荐个性化的健身计划。这些计划不仅科学合理&#xff0c;而且…

零基础入门学用Arduino 第二部分(二)

重要的内容写在前面&#xff1a; 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后&#xff0c;整体感觉是很好的&#xff0c;如果有条件的可以先学习一些相关课程&#xff0c;学起来会更加轻松&#xff0c;相关课程有数字电路…

Pytorch环境配置的方法

Pytorch虚拟环境配置全流程 以安装pytorch1.9.1为例 1. 创建虚拟环境 安装Anaconda3&#xff0c;打开 PowerShell 创建虚拟环境并进入&#xff1a; conda create -n torch1.9.1 python3.8 conda activate torch1.9.1 conda create -n torch1.9.1 python3.8 conda activate to…

Flowable-决策表设计器

✨✨✨ 最好用的Flowable决策表设计器 ✨✨✨ 最好用的Flowable流程设计器 本文中内容和案例出自贺波老师的书《深入Activiti流程引擎&#xff1a;核心原理与高阶实战》&#xff0c;书中的介绍更全面、详细&#xff0c;推荐给大家。 深入Activiti流程引擎

3dsMax怎样让渲染效果更逼真出色?三套低中高参数设置

渲染是将精心构建的3D模型转化为逼真图像的关键步骤。但要获得令人惊叹的渲染效果&#xff0c;仅仅依赖默认设置是不够的。 实现在追求极致画面效果的同时&#xff0c;兼顾渲染速度和时间还需要进行一些调节设置&#xff0c;如何让渲染效果更加逼真&#xff1f; 一、全局照明与…

【递归、搜索与回溯】综合练习一

综合练习一 1.找出所有子集的异或总和再求和2.全排列 II3.电话号码的字母组合4.括号生成 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.找…

sku与spu的区别!!!

一个 SPU 可以有多个 SKU。

深度学习(六)——神经网络的基本骨架:nn.Module的使用

一、torch.nn简介 官网地址&#xff1a; torch.nn — PyTorch 2.0 documentation 1. torch.nn中的函数简介 Containers&#xff1a;神经网络的骨架 Convolution Layers&#xff1a;卷积层 Pooling layers&#xff1a;池化层 Padding Layers&#xff1a;Padding Non-linear …

Linux多线程编程中的同步与互斥

文章目录 一、线程同步与互斥1、理解线程同步2、互斥的概念3、小结 二、互斥锁&#xff08;Mutex&#xff09;1、互斥锁的定义和作用2、pthread库中的互斥锁3、互斥锁的实现原理4、示例代码演示互斥锁的基本用法 三、条件变量&#xff08;Condition Variable&#xff09;1、条件…

RK3566调试VI5301

VI5301是南京芯视界推出的一款直接飞行时间&#xff08;dToF&#xff09;传感器&#xff0c;与ST的VL53L0x兼容。 一、开发平台 系统&#xff1a;linux 4.19(buidroot) 二、驱动移植 解压厂家提供的驱动文件&#xff1a;VI5301_Linux_General_M40_V202&#xff0c;目录结构…