@Configuration嵌套类未自动加载application.yaml属性的原因咨询
问题解析:嵌套配置属性未自动加载的原因
问题场景
你定义了如下配置类与配置文件:
配置类代码
@Configuration @ConfigurationProperties(prefix = "aa") @Validated @Setter @Getter public class AA { ... private BB bb; @Bean public BB bb() { return new BB(); } @Setter @Getter public static class BB { private String someProperty; } }
配置文件(application.yaml)
aa: bb: someProperty: somevalue
运行应用时,BB类的someProperty并未加载到配置值somevalue,只有给BB类添加@ConfigurationProperties(prefix = "aa.bb")注解后才能正常加载。疑问在于:为何需要添加该注解?按预期Spring应通过AA类中的private BB bb属性自动为BB类构造前缀。
原因解析
@ConfigurationProperties的作用范围限制:@ConfigurationProperties(prefix = "aa")仅作用于AA类自身的属性,不会自动传递给它的嵌套类或通过@Bean声明的对象。Spring不会自动推断嵌套类的配置前缀,因为BB是通过@Bean方法创建的独立Bean,它和AA类的bb属性只是普通的Java对象引用关系,并非配置绑定的继承关系。- 独立Bean的配置绑定规则:当你在
AA类中用@Bean声明BB时,这个BB是一个独立的Spring Bean,默认不会关联AA的配置前缀。要让它绑定对应路径的配置,必须显式给BB添加@ConfigurationProperties注解并指定前缀aa.bb,这样Spring才会将yaml中对应路径的配置值注入到该Bean中。 - 嵌套属性的正确无Bean写法:如果不需要将
BB作为独立Bean,仅作为AA的嵌套属性使用,你可以删除@Bean bb()方法。此时Spring会自动通过AA的前缀aa,将aa.bb.someProperty绑定到AA的bb属性的someProperty字段上,这种场景下不需要给BB添加@ConfigurationProperties注解。
内容的提问来源于stack exchange,提问作者AndCode
相关产品推荐
相关产品推荐

