假设我有一个用AppProperties
注释的@ConfigurationProperties("app")
POJO。它包含不同的应用程序属性,通常用于配置@Configuration
类中的bean。
@EnableConfigurationProperties(AppProperties.class)
使其可用于@Autowiring
,这对于Java配置非常方便。
但是我的应用上下文的一部分是使用老式的XML配置来配置的。我想知道如何在XML配置中访问@ConfigurationProperties AppProperties
bean?如果只有@EnableConfigurationProperties
为我提供了提供name
的能力,那么我可能可以在XML中使用SpEL,例如:#{appProperties.requiredProp}
(我真的很想实现)。
不幸的是,我看不到提供名称的方法,并且我尝试使用建议的appProperties
名称的尝试失败了:
SpelEvaluationException:EL1008E:在类型为“ org.springframework.beans.factory.config.BeanExpressionContext”的对象上找不到属性或字段“ appProperties”-可能不公开或无效?
我在调试器中看到,该bean实际上被称为app-my.package.AppProperties
,它并不明显,也从未明确声明。
在JavaDoc for @EnableConfigurationProperties
中,我注意到以下内容:
@ConfigurationProperties
bean可以以标准方式注册(例如,使用@Bean
方法),或者为了方便起见,可以在此(@EnableConfigurationProperties
)注释中直接指定。
这是否意味着我可以使用Java中的AppProperties
方法或XML中的application.properties
方法,以某种方式获得@Bean
的命名实例,并从<bean/>
注入值?
当然,我可以将整个AppProperties
自动连接到使用XML配置的类,但是我认为这不是一个好的设计解决方案,因为它只对{中的单个String
属性感兴趣{1}}。也许我不应该尝试在XML中使用这种“类型安全”的属性方式,而只是坚持旧的方式:使用AppProperties
分辨率,但是我感觉我在${}
概念中缺少一些东西,因此请让我知道。
答案 0 :(得分:0)
有两种方法可以注册配置属性bean。
向@EnableConfigurationProperties
注册。
@EnableConfigurationProperties(AppProperties.class)
public class Application {}
@ConfigurationProperties("app")
public class AppProperties {}
@EnableConfigurationProperties
注释将自动将AppProperties
类注册为名为prefix-your.package.AppProperties
的bean,当您按如下方式包含该类时:@EnableConfigurationProperties(AppProperties.class)
和AppProperties
都有一个前缀@ConfigurationProperties("app")
。
注册@Component
或@Bean
@EnableConfigurationProperties
public class Application {}
@Component
@ConfigurationProperties("app")
public class AppProperties {}
或
@EnableConfigurationProperties
public class Application {
@Bean
@ConfigurationProperties("app")
public AppProperties appProperties() {
return new AppProperties();
}
}
@Component
和@Bean
将注册一个名为appProperties
的bean。
通过使用第二种方法,您将能够使用SpEL获取属性#{appProperties.requiredProp}