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.mzph.cn/bicheng/27289.shtml

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

相关文章

设计模式-享元模式(结构型)

享元模式 享元模式是一种结构型模式&#xff0c;它主要用于减少创建对象的数量&#xff0c;减少内存占用。通过重用现有对象的方式&#xff0c;如果未找到匹配对象则新建对象。线程池、数据库连接池、常量池等池化的思想就是享元模式的一种应用。 图解 角色 享元工厂&#xf…

Python第二语言(五、Python文件相关操作)

目录 1. 文件编码的概念 2. 文件的读取操作 2.1 什么是文件 2.2 open()打开函数 2.3 mode常用的三种基础访问模式 2.4 文件操作及案例 3. 文件的写入操作及刷新文件&#xff1a;write与flush 4. 文件的追加操作 5. 文件操作的综合案例&#xff08;文件备份操作&#x…

Linux文件系统讲解!

一、Linux文件系统历史 1、在早期的时候Linux各种不同发行版拥有自己各自自定义的文件系统层级结构。 2、当我用Red hat转向玩Debian时&#xff0c;我进入/etc我都是懵的。 3、后来Linux社区做了一个标准、FHS&#xff08;文件系统标准层次结构&#xff09;。来帮助Linux系统的…

1_常见指令【Linux中常见30个指令的学习和使用】【万字长文】

常见指令以及权限理解 开始学习linux前的注意事项 在学习linux之前&#xff0c;我们要知道linux是一个操作系统。 那操作系统是什么呢&#xff1f;&#xff08;这里只做大概了解&#xff09; 操作系统就是一个管理软硬件的软件。 它对上提供良好&#xff08;稳定、高效、安…

做材料科学领域研究热点:高通量多尺度材料计算和机器学习

研究背景 材料科学是一个重要领域&#xff0c;涉及物质的研究和利用。随着科技进步&#xff0c;材料学已成为多学科交叉的前沿领域之一&#xff0c;融合物理、化学、数学、信息、力学和计算科学等知识。寻找更坚固的新材料已成为当今急需解决的问题。 材料基因工程作为一项颠覆…

长亭Nginx入门

在学习Nginx时我们先学习下防火墙原理】 将流量代理给防火墙 这样WAF 会分析流量 防火墙安装网络拓扑图 流量给防火墙 再给负载均衡 反向代理这个网络拓扑图是 防火墙充当了反向代理角色 所以我们就知道了我们为了要学习Nginx 因为这个服务器支持很多功能模块 自己本身就能…

开源项目-Docker部署学之思管理系统

开源-Docker部署学之思管理系统 文章目录 开源-Docker部署学之思管理系统资源列表基础环境一、安装Docker二、配置加速器三、查看Docker版本四、Git获取源码五、编辑SQL脚本六、访问管理系统如果访问或者登录的时候出现内部服务错误&#xff0c;评论或私信&#xff0c;我给你解…

Cisco Packet Tracer实验(三)

续实验二 问题一&#xff1a;使用二层交换机连接的网络需要配置网关吗&#xff1f;为什么&#xff1f; 二层交换机作为网络设备中的一种&#xff0c;主要用于在局域网&#xff08;LAN&#xff09;内部进行数据包的转发。它工作在OSI模型的第二层&#xff08;数据链路层&#xf…

SpringSecurity6从入门到实战之SpringSecurity6自定义认证规则

SpringSecurity6从入门到实战之SpringSecurity6自定义认证规则 Spring Security 中默认所有的 http 请求都需要先认证通过后&#xff0c;才能访问。那么&#xff0c; 如何指定不需要认证就可以直接访问的资源呢&#xff1f;比如 用户的登录页面和注册页面&#xff0c;都是不需要…

【面试干货】深入理解Java中的final关键字

【面试干货】深入理解Java中的final关键字 一、被 final 修饰的类二、被 final 修饰的方法三、被 final 修饰的变量四、被 final 修饰的常量 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java中&#xff0c;final关键字有多种用途&…

RV32F\RV32D指令集

RV32F\RV32D指令集 F扩展1、浮点控制状态寄存器2、指令类型F扩展 F扩展增加了32个浮点寄存器f0-f31,每个32位宽,以及一个浮点控制和状态寄存器fcsr,其中包含浮点单元的工作模式和异常状态。FLEN=32表示F单精度浮点扩展,大多数浮点指令对浮点寄存器中的值进行操作。浮点加载…

基于JSP技术的电子商城系统

开头语&#xff1a; 你好&#xff0c;我是计算机学长码农猫哥。如果你对电子商城系统感兴趣或有相关开发需求&#xff0c;欢迎联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术 工具&#xff1a;Eclipse、Tomcat 系统展示 首页 管理…

08_基于GAN实现人脸图像超分辨率重建实战_超分辨基础理论

1. 超分辨的概念与应用 我们常说的图像分辨率指的是图像长边像素数与图像短边像素数的乘积,比如iPhoneX手机拍摄照片的分辨率为 4032px3024px,为1200万像素。 显然,越高的分辨率能获得更清晰的成像。与之同时,分辨率越高也意味着更大的存储空间,对于空间非常有限的移动设…

【Pytorch】一文向您详细介绍 torch.nn.DataParallel() 的作用和用法

【Pytorch】一文向您详细介绍 torch.nn.DataParallel() 的作用和用法 下滑查看解决方法 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高…

UnityAPI学习之延时调用(Invoke)

延时调用&#xff08;Invoke&#xff09; 当我们进行简单函数的延时调用不想使用协程时&#xff0c;我们可以使用Invoke()函数 using System.Collections; using System.Collections.Generic; using UnityEngine;public class NO15_Invoke : MonoBehaviour {//显示在每次生成…

WARNING: pip is configured with locations that require TLS/SSL

在pycharm中运行pip下载软件包遇到该问题&#xff1a;WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available 原因&#xff1a;没有安装openssl&#xff1b; 到https://slproweb.com/products/Win32OpenSSL.ht…

Python实现逻辑回归与判别分析--西瓜数据集

数据 数据data内容如下&#xff1a; 读取数据&#xff1a; import numpy as np import pandas as pd data pd.read_excel(D:/files/data.xlsx) 将汉字转化为01变量&#xff1a; label [] for i in data[好瓜]:l np.where(i 是,1,0)label.append(int(l)) data[label] lab…

【unity笔记】一、常见技术名词解析(HDRP/URP)

一、简介 在Unity中&#xff0c;Shader是用于控制图形渲染过程中顶点和像素处理的程序。Shader通常用于定义物体在屏幕上呈现的外观&#xff0c;包括光照、纹理、颜色和其他视觉效果。Shader编写在特定的着色语言中&#xff0c;如HLSL&#xff08;High-Level Shading Language…

计算机网络重要知识点

OSI 七层模型 是国际标准化组织提出的一个网络分层模型。 TCP/IP 四层模型 是目前被广泛采用的一种模型,我们可以将 TCP / IP 模型看作是 OSI 七层模型的精简版本&#xff0c;由以下 4 层组成&#xff1a; 应用层传输层网络层网络接口层 复杂的系统需要分层&#xff0c;因为每…

mysql中 什么是锁

大家好。上篇文章我们讲了事务并发执行时可能带来的各种问题&#xff0c;今天我们来聊一聊mysql面试必问的问题–锁。 一、解决并发事务带来问题的两种基本方式 1. 并发事务访问相同记录的情况 并发事务访问相同记录的情况大致可以划分为3种&#xff1a; 读-读情况&#xf…