Spring:无法使用Environment从XML注入属性到JavaConfig

时间:2015-03-27 03:47:52

标签: java spring spring-mvc dependency-injection spring-java-config

我正在努力支持使用基于XML的配置的传统Spring Java项目。从属性源注入就像这样:

<context:property-placeholder location="classpath:app.properties"/>

我正在开发一个新功能,该功能作为一个单独的Spring项目实现,作为对旧项目的依赖。为了跟上时代的步伐,新项目使用JavaConfig而不是基于XML的配置。因此,我的类使用@Configuration注释,其中包含一些@Bean方法,并在我的项目中设置类的其他逻辑。我通过在XML配置中将其声明为bean来注入并加载配置:

<context:annotation-config/>
<beans:bean class="com.example.MyDefaultConfiguration"/>

这个JavaConfig依赖于某些注入的属性。我从各种来源(例如this blog postthis SOF answer)中读到的是,这可以通过在我的JavaConfig类中注入Environment实例来完成。因此,我将此作为注入的全局字段:

@Inject
private Environment environment;

然后我可以根据需要在@Bean方法中执行此操作:

String prop = environment.getProperty("my.property");

但是,在环境中找不到此属性并导致值为null,尽管它在我的classpath的app.properties文件中清楚地列出。相反,如果我使用@Value注释样式注入属性,如下所示,那么我确实将String变量正确地注入:

@Value("${my.property}")
private String prop;

我很高兴我能够解决问题,但我仍然非常好奇为什么注入的环境变量样式对我不起作用。这让我担心我在某处搞砸了某种配置。有人有什么想法吗?

1 个答案:

答案 0 :(得分:2)

<context:property-placeholder location="classpath:app.properties"/>

基本上等同于

<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <property name="locations" value="classpath:app.properties" />
</bean>

这只是一个带有属性的bean。春天Environment没有参与。也就是说,属性占位符配置器定义和加载的属性不会添加到Environment,因此您无法通过它检索它们。

通过Java注释配置,您可以通过Environment类注释@Configuration类来添加属性@PropertySources@PropertySource类指定@PropertySources(value = { @PropertySource(value = "classpath:app.properties") }) @Configuration public class Example {} 值数组。

@Autowired
private Environment env;
...
env.getProperty("my.property");

并检索它们

location

您无需向property-placeholder提供{{1}}。