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…

如何在WordPress中上传多种安装包文件

WordPress默认情况下不允许上传某些类型的文件&#xff0c;如应用安装包文件&#xff08;如APK、EXE、DMG等&#xff09;。为了实现上传这些文件&#xff0c;我们需要调整WordPress的文件上传限制。本文将详细介绍如何在WordPress中上传Windows、Mac、Linux、Android、iOS和Har…

web前端图片分区:深入探索其原理、应用与未来趋势

web前端图片分区&#xff1a;深入探索其原理、应用与未来趋势 在web前端开发中&#xff0c;图片分区作为一种优化技术&#xff0c;正逐渐受到开发者的青睐。通过将大型图片划分为多个小区块&#xff0c;图片分区能够实现更高效的加载和渲染&#xff0c;从而提升用户体验。本文…

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;融合物理、化学、数学、信息、力学和计算科学等知识。寻找更坚固的新材料已成为当今急需解决的问题。 材料基因工程作为一项颠覆…

Spring boot 注解实现幂等性

1. 添加 Spring AOP 依赖 在 pom.xml 中添加如下依赖&#xff1a; <dependencies><!-- Spring AOP dependency --><dependency><groupIdorg.springframework.boot</groupId><artifactIdspring-boot-starter-aop</artifactId></depend…

C++入门小结

C命名空间总结 C 中的命名空间&#xff08;Namespace&#xff09;是一种组织代码的方式&#xff0c;用于避免全局命名冲突。在同一个命名空间中&#xff0c;可以有相同名称的变量、函数和类&#xff0c;但它们彼此互不影响。下面是对 C 命名空间的一些总结&#xff1a; 定义命…

使用Java实现自定义的ClassLoader

Java类加载机制是Java虚拟机&#xff08;JVM&#xff09;中非常重要的部分&#xff0c;它负责将字节码加载到内存中&#xff0c;并生成对应的Class对象。在Java中&#xff0c;类加载器&#xff08;ClassLoader&#xff09;是这一过程的核心组件。了解和实现自定义的ClassLoader…

IOS中使用input页面被聚焦放大

IOS中使用input页面被聚焦放大 解决方案&#xff1a; 第一步&#xff0c;head标签中设置如下meta <meta name"viewport" content"widthdevice-width,initial-scale1.0,user-scalableno">第二步&#xff0c;增加如下meta <!--兼容ios设备input聚…

长亭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…

超维小课堂 | 7、ROS使用offboard模式控制无人机定点悬停源码分析

引言&#xff1a;ROS使用offboard模式控制无人机进入定点悬停是学习ROS无人机控制的最经典的基本功能之一。基于此&#xff0c;本篇主要对此处的控制流程著一个简要的代码分析。&#xff08;室内外通用代码&#xff09; 顾名思义&#xff1a;offboard模式下的定点悬停是指通过…

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

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

ramda函数式编程库--可以帮助处理不可变数据

ramda 介绍深拷贝与浅拷贝示例代码**使用 clone 函数****clone 函数也可以用来深拷贝数组&#xff1a;** 介绍 ramda 是一个功能强大的函数式编程库&#xff0c;可以帮助你处理不可变数据。 clone 是 ramda 中的一个函数&#xff0c;用于深拷贝对象或数组。以下是关于 clone 函…

内网管理软件IP-Guard实施方案

1. 引言 本方案旨在指导企业如何实施内网管理软件IP-Guard&#xff0c;通过服务器的安装、员工客户端的部署以及基本策略的定制&#xff0c;实现对企业内部网络的有效管理和监控。IP-Guard是一款集成了设备管控、数据防泄漏、日志审计等多种功能于一体的内网安全管理软件&…

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

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

C++ Primer 学习 -- Day 1

第 1、2 章知识点总结 1、Hello&#xff0c;World&#xff01;1.1、输入输出1.2、while(std::cin >> value) 2、变量和基本类型2.1.1、unsigned建议 2.1.2 类型转换建议建议 2.2.1 变量定义提醒列表初始化提醒 2.2.2 变量声明和定义提醒 2.3.1 引用引用特点 2.3.2 指针指…