关于Spring @Bean 相同加载顺序不同结果不同的问题记录

2025-02-15 05:50

本文主要是介绍关于Spring @Bean 相同加载顺序不同结果不同的问题记录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的...

问题说明

两个全注解类

LocalConfig1

@Configuration
public class LocalConfig1 {
    public LocalConfig1(){
        System.out.println("LocalConfig1()");
    }
    @Bean(name = "x1")
    public X x() {
        System.out.println("start new X 1");
        return new X("xName");
    }
}

LocalConfig2

@Configuration
public class LocalConfig2 {
    public LocalConfig2(){
        System.out.println("LocalConfig2()");
    }
    @Bean(name = "x1")
    public X x() {
        System.out.println("start new X 2");
        www.chinasem.cnreturn new X();
    }
    @Bean
    public Y y() {
        System.out.printlpythonn("start new Y");
        return new Y();
    }
}

对于@Bean X类型的使用了不同的构造函数

public class X {
    private String xName;
    @Autowired
    private Y y;
    public X() {
        System.out.println("X()");
    }
    public X(String xName) {
        this.xName = xName;
    }
    public void sy(){
        System.out.println("y:" + y);
    }
    public void sayMyName(){
        System.out.println("xName:" + xName);
    }
}

测试输出1

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

http://www.chinasem.cn

测试输出2

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

即不同的顺序导致了结果的不同

@Bean注解的BeanDefinition加入时机

回顾:https://doctording.blog.csdn.net/article/details/14486508javascript2 & https://doctording.blog.csdn.net/article/details/144868096 中的知识

使用new AnnotationConfigApplicationContext后会默认加入ConfigurationClassPostProcessor的beanDefinition,并在refresh()方法中的invokeBeanFactoryPostProcessors(beanFactory);完成实例化,即得到ConfigurationClassPostProcessor,然后执行其 invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry); 方法

因为ConfigurationClassPostProcessor是一个BeanDefinitionRegistryPostProcessor

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

在执行过程中会判断全注解类

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

然后继续从全注解类中加载可能的bean

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

从LocalConfig1中可以读到@Bean注解方法,然后添加BeanDefintion

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

从LocalConfig2中可以也读到@Bean注解方法,然后添加BeanDefintion; 其中相同的BeanName直接覆盖了,如下图:

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

所以看全注解加载顺序,取了最后那个beanDefinition, 所以出现了了测试现象。

总结

本例是在spring 5.1.3.RELEASE版本下的测试,探究了存在不同全注解类有相同的@Bean的情况,加载顺序不同导致的最后Bean实例不同。工作中应该避免这种写法,同时也要注意自身Spring版本用到了是否有此逻辑

到此这篇关于关于Spring @Bean 相同加载顺序不同结果不同的问题记录的文章就介绍到这了,更多相关Spring @Bean 加载顺序内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于关于Spring @Bean 相同加载顺序不同结果不同的问题记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题

《Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题》:本文主要介绍Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录一、前言二、系统架构检测三、卸载旧版 Go四、下载并安装正确版本五、配置环境变量六、验证安装七、常见

SpringBoot基础框架详解

《SpringBoot基础框架详解》SpringBoot开发目的是为了简化Spring应用的创建、运行、调试和部署等,使用SpringBoot可以不用或者只需要很少的Spring配置就可以让企业项目快... 目录SpringBoot基础 – 框架介绍1.SpringBoot介绍1.1 概述1.2 核心功能2

Spring Boot 事务详解(事务传播行为、事务属性)

《SpringBoot事务详解(事务传播行为、事务属性)》SpringBoot提供了强大的事务管理功能,通过@Transactional注解可以方便地配置事务的传播行为和属性,本文将详细介绍Spr... 目录Spring Boot 事务详解引言声明式事务管理示例编程式事务管理示例事务传播行为1. REQUI

使用nohup和--remove-source-files在后台运行rsync并记录日志方式

《使用nohup和--remove-source-files在后台运行rsync并记录日志方式》:本文主要介绍使用nohup和--remove-source-files在后台运行rsync并记录日... 目录一、什么是 --remove-source-files?二、示例命令三、命令详解1. nohup2.

Spring AI 实现 STDIO和SSE MCP Server的过程详解

《SpringAI实现STDIO和SSEMCPServer的过程详解》STDIO方式是基于进程间通信,MCPClient和MCPServer运行在同一主机,主要用于本地集成、命令行工具等场景... 目录Spring AI 实现 STDIO和SSE MCP Server1.新建Spring Boot项目2.a

spring security 超详细使用教程及如何接入springboot、前后端分离

《springsecurity超详细使用教程及如何接入springboot、前后端分离》SpringSecurity是一个强大且可扩展的框架,用于保护Java应用程序,尤其是基于Spring的应用... 目录1、准备工作1.1 引入依赖1.2 用户认证的配置1.3 基本的配置1.4 常用配置2、加密1. 密

Spring Boot 集成 Solr 的详细示例

《SpringBoot集成Solr的详细示例》:本文主要介绍SpringBoot集成Solr的详细示例,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录环境准备添加依赖配置 Solr 连接定义实体类编写 Repository 接口创建 Service 与 Controller示例运行

Spring Cloud GateWay搭建全过程

《SpringCloudGateWay搭建全过程》:本文主要介绍SpringCloudGateWay搭建全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Spring Cloud GateWay搭建1.搭建注册中心1.1添加依赖1.2 配置文件及启动类1.3 测

Java如何将文件内容转换为MD5哈希值

《Java如何将文件内容转换为MD5哈希值》:本文主要介绍Java如何将文件内容转换为MD5哈希值的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java文件内容转换为MD5哈希值一个完整的Java示例代码代码解释注意事项总结Java文件内容转换为MD5

Spring Boot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)

《SpringBoot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)》:本文主要介绍SpringBoot拦截器Interceptor与过滤器Filter深度解析... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实