如何在自定义@ConfigurationProperties的内部类型中实现@Autowire注入?
嵌套配置属性的依赖注入解决方案
你遇到的问题本质是Spring Boot默认只会将标注了@ConfigurationProperties的顶层类注册为Spring Bean,嵌套的内部类(比如你的Topics)不会自动成为可被@Autowired的Bean。下面是两种可行的解决方式:
方式一:手动注册嵌套类为Bean
通过配置类,从已注入的顶层配置属性中取出嵌套实例,将其注册为Spring Bean:
@Configuration public class BeanRegistrationConfig { @Bean public Custom.Topics customTopics(Custom custom) { return custom.topics(); } }
完成注册后,你就可以直接通过@Autowired注入Custom.Topics类型的实例了。
方式二:将嵌套类改为独立的配置属性类
如果Topics本身需要被单独配置和注入,可以把它抽出来作为独立的配置属性类,指定对应的配置前缀:
@ConfigurationProperties("a.b.topics") public record Topics(String topicA, String topicB) {} @ConfigurationProperties("a.b") public record Custom(Topics topics) {}
然后在启动类或配置类上添加@EnableConfigurationProperties注解,同时指定这两个类:
@SpringBootApplication @EnableConfigurationProperties({Custom.class, Topics.class}) public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
这种方式下,Topics会被Spring自动注册为Bean,支持直接@Autowired注入,同时原有的Custom配置结构也能正常工作。
最佳选择建议
- 若
Topics仅作为Custom的附属配置,优先选择方式一,保持配置结构的内聚性; - 若
Topics需要被多个组件独立使用,或者本身有独立的配置需求,选择方式二更灵活。
内容的提问来源于stack exchange,提问作者vab2048
相关产品推荐
相关产品推荐

