如何通过 XML 配置中的名称访问 @ConfigurationProperties bean?

Kir*_*ill 4 spring spring-boot

假设我有一个AppProperties@ConfigurationProperties("app"). 它包含不同的应用程序属性,我通常使用这些属性在@Configuration类中配置我的 bean 。 @EnableConfigurationProperties(AppProperties.class)使其可用于@Autowiring,这对于 Java 配置非常方便。

但是我的应用程序上下文的一部分是使用过时的 XML 配置来配置的。我想知道如何@ConfigurationProperties AppProperties在 XML 配置中访问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我注意到以下几点:

@ConfigurationPropertiesbean 可以以标准方式注册(例如使用@Bean方法),或者为方便起见,可以直接在此 ( @EnableConfigurationProperties) 注释上指定。

这是否意味着我可以AppProperties通过application.properties使用@BeanJava 或<bean/>XML 中的任一方法注入的值以某种方式获得命名实例?

当然,我可以在整个自动装配AppProperties与XML配置的类,但我不认为这是一个很好的设计解决方案,因为上午只在一个感兴趣String的财产AppProperties。可能我不应该尝试在 XML 中使用这种“类型安全”属性方式,而只是坚持旧方式:使用${}-resolution,但我觉得我在@ConfigurationProperties概念中遗漏了一些东西,所以请告诉我。

Ren*_*407 8

有两种方法可以注册配置属性 bean。

注册@EnableConfigurationProperties.

 @EnableConfigurationProperties(AppProperties.class)
 public class Application {}

 @ConfigurationProperties("app")
 public class AppProperties {}
Run Code Online (Sandbox Code Playgroud)

@EnableConfigurationProperties当您按如下方式包含该类时,注解将自动将AppProperties类注册为一个名为 的 bean prefix-your.package.AppProperties@EnableConfigurationProperties(AppProperties.class)并且AppProperties有一个前缀@ConfigurationProperties("app").

注册@Component@Bean

 @EnableConfigurationProperties
 public class Application {}

 @Component
 @ConfigurationProperties("app")
 public class AppProperties {}
Run Code Online (Sandbox Code Playgroud)

或者

@EnableConfigurationProperties
public class Application {

    @Bean
    @ConfigurationProperties("app")
    public AppProperties appProperties() {
        return new AppProperties();
    }

}
Run Code Online (Sandbox Code Playgroud)

@Component@Bean会注册一个名为豆appProperties。通过使用第二种方法,您将能够使用 SpEL 来获取属性#{appProperties.requiredProp}