springboot bean覆盖注册的问题(allowBeanDefinitionOverriding配置)
springboot bean覆盖注册的问题-allowBeanDefinitionOverriding配置
问题描述
问题分析
1. allowBeanDefinitionOverriding配置
2. bean加载顺序
问题描述
项目引用三方jar包,需要对@Configuration配置类中的某个bean进行重写。过程中遇到了bean已被注册异常、以及新加的bean不加载的问题。
问题分析
测试项目中的问题时,写了两个config,都注册了RestTemplate
DefaultConfig
1 2 3 4 5 6 7 8 9 | package top.macondo; @Configuration public class DefaultConfig { @Bean public RestTemplate getRestTemplate() { System.out.println( "default bean" ); return new RestTemplate(); } } |
NewConfig
1 2 3 4 5 6 7 8 9 | package com.example; @Configuration public class NewConfig { @Bean public RestTemplate getRestTemplate(){ System.out.println( "new bean" ); return new RestTemplate(); } } |
1. allowBeanDefinitionOverriding配置
在默认情况下,启动服务后,会报bean已被注册异常。
1 | The bean 'getRestTemplate' , defined in class path resource [top/macondo/DefaultConfig. class ], could not be registered. A bean with that name has already been defined in class path resource [com/example/NewConfig. class ] and overriding is disabled. |
springboot中,allowBeanDefinitionOverriding 默认为false;spring默认为true。需要在application.properties中新增spring.main.allow-bean-definition-overriding=true
参考spring中 allowBeanDefinitionOverriding(spring.main.allow-bean-definition-overriding) 分析
2. bean加载顺序
配置allowBeanDefinitionOverriding为true后,却出现新配置不注册的问题。经过对加载流程的进一步排查,发现NewConfig中的RestTemplate被DefaultConfig覆盖。
@SpringBootApplication的属性scanBasePackages数组,注册bean时,是按数组顺序注册的。把引用包的包名写在项目包名前面,项目中的配置类才可覆盖掉引用包的bean。
1 2 3 4 5 6 7 8 9 10 11 12 | @SpringBootApplication (scanBasePackages = { "top.macondo" , "com.example" }) spring中的ComponentScanAnnotationParser包扫描代码 protected Set<BeanDefinitionHolder> doScan(String... basePackages) { Assert.notEmpty(basePackages, "At least one base package must be specified" ); Set<BeanDefinitionHolder> beanDefinitions = new LinkedHashSet<>(); //依次对basePackages中配置的类进行注入 for (String basePackage : basePackages) { Set<BeanDefinition> candidates = findCandidateComponents(basePackage); ... } return beanDefinitions; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架