Spring:无法使用来自 XML 的环境将 属性 注入到 JavaConfig
Spring: Unable to inject property using Environment from XML to JavaConfig
我正在努力支持使用基于 XML 配置的遗留 Spring Java 项目。从 属性 源注入是这样完成的:
<context:property-placeholder location="classpath:app.properties"/>
我正在开发一项新功能,该功能作为单独的 Spring 项目实施,作为对旧项目的依赖。为了与时俱进,该新项目使用 JavaConfig 而不是基于 XML 的配置。因此,我的 class 带有 @Configuration
注释,其中有一些 @Bean
方法,并执行其他逻辑以在我的项目中设置 classes。我通过在 XML config:
中将其声明为 bean 来注入并加载配置
<context:annotation-config/>
<beans:bean class="com.example.MyDefaultConfiguration"/>
此 JavaConfig 依赖于一些注入的属性。我从各种来源(例如 this blog post and this SOF answer)了解到,这可以通过将 Environment
实例注入我的 JavaConfig class 来完成。因此我将其作为注入的全局字段:
@Inject
private Environment environment;
然后我可以根据需要在@Bean 方法中执行此操作:
String prop = environment.getProperty("my.property");
但是,在环境中找不到此 属性 并导致值为 null,尽管它已明确列在我的 classpath 的 app.properties 文件中。相反,如果我要使用 @Value
注释样式注入 属性,如下所示,那么我确实会正确地将 String 变量注入到:
@Value("${my.property}")
private String prop;
很高兴我能够解决这个问题,但我仍然非常好奇为什么注入的环境变量样式对我不起作用。这让我担心我在某处搞砸了某种配置。有人有什么想法吗?
这个
<context:property-placeholder location="classpath:app.properties"/>
本质上等同于
<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="locations" value="classpath:app.properties" />
</bean>
这只是一个带有 属性 的 bean。 Spring Environment
不涉及。也就是说,由 属性 占位符配置器定义和加载的属性不会添加到 Environment
中,因此您无法通过它检索它们。
通过 Java 注释配置,您可以通过使用 @PropertySources
注释您的 @Configuration
class 来向 Environment
添加属性,该 @PropertySources
指定数组 @PropertySource
值。
@PropertySources(value = { @PropertySource(value = "classpath:app.properties") })
@Configuration
public class Example {}
并检索它们
@Autowired
private Environment env;
...
env.getProperty("my.property");
这样您就不需要向 property-placeholder
提供 location
。
我正在努力支持使用基于 XML 配置的遗留 Spring Java 项目。从 属性 源注入是这样完成的:
<context:property-placeholder location="classpath:app.properties"/>
我正在开发一项新功能,该功能作为单独的 Spring 项目实施,作为对旧项目的依赖。为了与时俱进,该新项目使用 JavaConfig 而不是基于 XML 的配置。因此,我的 class 带有 @Configuration
注释,其中有一些 @Bean
方法,并执行其他逻辑以在我的项目中设置 classes。我通过在 XML config:
<context:annotation-config/>
<beans:bean class="com.example.MyDefaultConfiguration"/>
此 JavaConfig 依赖于一些注入的属性。我从各种来源(例如 this blog post and this SOF answer)了解到,这可以通过将 Environment
实例注入我的 JavaConfig class 来完成。因此我将其作为注入的全局字段:
@Inject
private Environment environment;
然后我可以根据需要在@Bean 方法中执行此操作:
String prop = environment.getProperty("my.property");
但是,在环境中找不到此 属性 并导致值为 null,尽管它已明确列在我的 classpath 的 app.properties 文件中。相反,如果我要使用 @Value
注释样式注入 属性,如下所示,那么我确实会正确地将 String 变量注入到:
@Value("${my.property}")
private String prop;
很高兴我能够解决这个问题,但我仍然非常好奇为什么注入的环境变量样式对我不起作用。这让我担心我在某处搞砸了某种配置。有人有什么想法吗?
这个
<context:property-placeholder location="classpath:app.properties"/>
本质上等同于
<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="locations" value="classpath:app.properties" />
</bean>
这只是一个带有 属性 的 bean。 Spring Environment
不涉及。也就是说,由 属性 占位符配置器定义和加载的属性不会添加到 Environment
中,因此您无法通过它检索它们。
通过 Java 注释配置,您可以通过使用 @PropertySources
注释您的 @Configuration
class 来向 Environment
添加属性,该 @PropertySources
指定数组 @PropertySource
值。
@PropertySources(value = { @PropertySource(value = "classpath:app.properties") })
@Configuration
public class Example {}
并检索它们
@Autowired
private Environment env;
...
env.getProperty("my.property");
这样您就不需要向 property-placeholder
提供 location
。