如何从XML配置中按名称访问@ConfigurationProperties bean?

时间:2019-01-01 22:20:48

标签: spring spring-boot

假设我有一个用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分辨率,但是我感觉我在${}概念中缺少一些东西,因此请让我知道。

1 个答案:

答案 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}