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=myBeanMain

management.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;
    }

    @Override
    public 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
{

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException
    {
        log.info("chz >>> MyBeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry():");
        // 修改bean的属性
        BeanDefinition mainBean1 = registry.getBeanDefinition("mainBean1");
        mainBean1.getPropertyValues().add("name", "[mainBean1 - 我被MyBeanDefinitionRegistryPostProcessor改了]");
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException
    {
        log.info("chz >>> MyBeanDefinitionRegistryPostProcessor.postProcessBeanFactory():");
        // 添加一个bean
        MainBean2 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
{
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException
    {
        log.info("chz >>> MyBeanFactoryPostProcessor.postProcessBeanFactory():");
        // 添加一个bean
        MainBean3 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
{
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        log.info("chz >>> MyBeanPostProcessor.postProcessBeforeInitialization(): {}", beanName);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException
    {
        log.info("chz >>> MyBeanPostProcessor.postProcessAfterInitialization(): {}", beanName);
        if( (bean instanceof IMainBean4) && !(bean instanceof MainBean4Proxy)){
            // 代码bean
            bean = 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】
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Bytebase 2.19.0 - 支持 DynamoDB

Bytebase 2.19.0 支持 DynamoDB 支持独立的 SQL 审核工单。 支持为工单事件配置 Slack 私信通知。 file 支持 PostgreSQL 的 DML 变更事前备份。 为 SQL Server 添加 SQL 审核规则&#xff1a;禁止冗余索引。 重大变更 创建多数据库工单时&#xff0c;不同数据库会共享同…

网络安全知识全景地图V1.0 - 20240616更新

网络安全领域的知识全景涵盖了从基础概念到高级技术的广泛内容。博主基于自身十年多的工作经验结合CISSP认证官方教材按照不同的主题和层次梳理出如下高层次的概览地图&#xff0c;可以帮助个人和组织理解网络安全领域的主题。 1.1. 基础理论 1.1.1. 网络安全概述 网络安全的…

区块链中的gas与转账收款相关概念

区块链是一个经济系统 计算与存储系统都是稀缺的&#xff0c;区块链的工作需要消耗资源共识、trustless需要矿工的工作&#xff0c;而矿工需要激励Transaction的执行有成本&#xff08;gas&#xff09;,gas费成为矿工的奖励ether是这个经济生态系统的通行货币 关心的问题 合…

vue(v-if,v-else-if-else-show)

基本应用 例子 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTE-8"> <meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-w…

Swift 是 C++ 的最佳继任者

苹果称 Swift 是 C 的最佳继任者 Swift 是苹果公司在 2014 年推出的&#xff0c;一款旨在替代 Objective-C 的编程语言。但苹果语言和运行时总监 Ted Kremenek 在 WWDC24 的主题演讲中表示&#xff0c;Swift 也将取代 C。 “Swift 的安全性、速度和易用性&#xff0c;加上内…

面试题 17.09. 第 k 个数

链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a;堆和hash表 class Solution { public:int getKthMagicNumber(int k) {if (k < 0) {return -1;}if (k 1) {return 1;}std::unordered_set<int64_t> table;std::vector<int64_t> nu…

Docker部署常见应用之SFTP服务器

文章目录 简介Dockers部署单用户多用户用户信息加密使用SSH密钥认证 参考文章 简介 atmoz/sftp 是一个基于 Docker 的 SFTP 服务镜像&#xff0c;它使用 OpenSSH 来提供 SFTP 服务。这个镜像支持创建单个或多个用户的 SFTP 访问&#xff0c;并允许用户通过 SFTP 协议安全地共享…

GenICam标准(五)

系列文章目录 GenICam标准&#xff08;一&#xff09; GenICam标准&#xff08;二&#xff09; GenICam标准&#xff08;三&#xff09; GenICam标准&#xff08;四&#xff09; GenICam标准&#xff08;五&#xff09; GenICam标准&#xff08;六&#xff09; 文章目录 系列文…

jupyter notebook中使用不同的anaconda环境及常用conda命令

conda命令 在jupyter notebook中使用不同的anaconda环境其他常用conda命令 在jupyter notebook中使用不同的anaconda环境 创建环境 myenvname 需替换为自己的环境名称 conda create --name myenvname python3.7激活环境 conda activate myenvname 在该环境中安装Jupyter N…

什么是专业的CRM客户管理系统,介绍crm客户管理系统的功能作用

CRM&#xff08;Customer Relationship Management&#xff09;客户管理系统&#xff0c;是现代企业不可或缺的一款管理工具。它集客户信息管理、销售自动化、客户服务与支持、数据分析与决策支持等多项功能于一身&#xff0c;帮助企业实现客户关系的全方位管理&#xff0c;从而…

【AI学习】Together AI的新研究:Together MoA(Mixture of Agents)

第一次听说Mixture of Agents&#xff0c;原来Agent也能混合&#xff0c;有意思&#xff01; 介绍 Together AI的最新研究“Together MoA”&#xff08;Mixture of Agents&#xff0c;代理混合&#xff09;是一种创新的方法&#xff0c;旨在通过结合多个开源大型语言模型&…

proDAD V4最新版软件安装包下载+详细安装步骤

简介&#xff1a; proDAD Adorage 是一款一体化的效果库&#xff0c;完美拥有所有的效果&#xff0c;集所有Adorage卷于一体&#xff0c;该系列包含13种可用套装中的17,000多种效果。 对于每种情况都能获得完美的效果&#xff0c;支持Adobe、avid、Corel、Cyberlink、MAGIX等多…

Setapp:只需一次订阅,即可获得 240 款+ Mac 软件

为一项任务寻找合适的应用程序是一项相当艰巨的任务。过去&#xff0c;最好的办法要么是花费宝贵的时间搜索可靠的评论&#xff0c;要么就是相信无论安装什么软件都能完成任务。 如果你是 Mac 用户&#xff0c;那么 Setapp 将让这一问题成为过去。无需在需要时下载单个程序&am…

special characters are not allowed

处理域名连接nacos读取配置异常 1 项目启动报错2 问题处理3 刷新依赖重启问题解决 1 项目启动报错 使用ip可以正在启动&#xff0c;但是使用域名报下面的错误 2024-06-15 17:37:22.981 ERROR 29268 --- [ main] c.a.c.n.c.NacosPropertySourceBuilder : parse …

1)Java项目笔记搭建系统梳理相关知识

目录 前言项目结构Java部分Spring整合部分SpringBoot整合部分 模块说明规划 小结javarabbitmqmybatisspring最后推荐几本工具书 前言 工作有年头了&#xff0c;学到了很多技术&#xff0c;收获了很多。但是对与工作相关的专业技能知识的掌握杂而乱&#xff0c;不够全面系统。因…

面试题 17.06. 2出现的次数

题解&#xff1a;. - 力扣&#xff08;LeetCode&#xff09;. - 力扣&#xff08;LeetCode&#xff09; 数位 DP 通用模板_哔哩哔哩_bilibili class Solution { public:int numberOf2sInRange(int n) {std::string str to_string(n);int len str.size();std::vector<std:…

嵌入式软件工程师入何突破瓶颈?

各位关注嵌入式软件工程师发展的朋友们&#xff0c;下面来探讨一下嵌入式软件工程师该如何突破瓶颈。首先要强调的是&#xff0c;不要仅仅将自己局限在嵌入式软件工程师这一角色定位上。 事实上&#xff0c;嵌入式软件工程师已经掌握了诸多业务层面的内容&#xff0c;完全有能力…

【AI+编程】工作日常场景随时可以AI编程,记一个问答SQL快速导出数据日常示例

今天有个场景&#xff0c;我们有个老项目&#xff0c;由于历史原因差不多1年多没使用了&#xff0c;恰巧客户紧急情况要使用。因为当时没有需求&#xff0c;所以V1.0上线后 就没做更新。 需求很简单&#xff1a;我们假定 项目问题表、客户表、问题答案表&#xff0c; 实时查询…

Linux文件与内容查阅、归档压缩

#Linux系统基础 文件与内容查找、归档压缩 find命令搜索文件 grep对文件的内容进行搜索 tar命令进行文件的压缩与解压缩 一、文件的查找 格式实例&#xff1a;find . -name "123.txt"说明find起始目录查找类型查找条件./ 或 .-name“123.txt”在当前目录中查找…

联想正式发布全栈算力基础设施新品,加速筑基AI 2.0时代

6月14日&#xff0c;以“异构智算 稳定高效”为主题的联想算力基础设施新品发布会在北京成功举办。 据「TMT星球」了解&#xff0c;在与会嘉宾和合作伙伴的见证下&#xff0c;联想正式发布率先搭载英特尔至强 6能效核处理器的联想问天WR5220 G5、联想ThinkSystem SR630 V4、联…