@ConfigurationProperties重复前缀问题:多Bean共享同配置如何实现?
解决@ConfigurationProperties重复前缀报错的方案
由于Spring不允许多个@ConfigurationProperties使用相同前缀,直接给两个Bean方法标注相同前缀会触发冲突。结合Base类无法修改的限制,提供以下两种可行方案:
方案一:通过中间配置类共享属性
创建单独的配置类绑定test前缀的属性,再在两个Bean的创建方法中注入该配置类,为Base实例的key赋值:
// 绑定test前缀的配置类 @ConfigurationProperties(prefix = "test") class TestProperties { var key: String? = null } // 启用配置属性绑定(若未全局开启) @Configuration @EnableConfigurationProperties(TestProperties::class) class BeanConfig { @Bean fun getA(testProperties: TestProperties): Base { return object : Base() { override var key: String = testProperties.key!! override fun execute() { // do something } } } @Bean fun getB(testProperties: TestProperties): Base { return object : Base() { override var key: String = testProperties.key!! override fun execute() { // do something else } } } }
该方案适合配置项较多的场景,便于统一管理配置属性,避免重复编写注入逻辑。
方案二:使用@Value直接注入属性
直接在Bean创建方法的参数中通过@Value注入配置值,再赋值给Base实例的key:
@Configuration class BeanConfig { @Bean fun getA(@Value("\${test.key}") key: String): Base { return object : Base() { override var key: String = key override fun execute() { // do something } } } @Bean fun getB(@Value("\${test.key}") key: String): Base { return object : Base() { override var key: String = key override fun execute() { // do something else } } } }
该方案更简洁,适合配置项较少的场景,无需额外创建配置类。
注意事项
- 确保配置文件
properties.yml中的test.key存在有效值,可根据业务需求替换方案一中的!!为空安全处理逻辑,避免空指针异常。 - 两种方案均无需修改依赖库中的Base类,仅需调整Bean的创建逻辑。
内容的提问来源于stack exchange,提问作者user3908406
相关产品推荐
相关产品推荐

