我正在努力支持使用基于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 post和this 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;
我很高兴我能够解决问题,但我仍然非常好奇为什么注入的环境变量样式对我不起作用。这让我担心我在某处搞砸了某种配置。有人有什么想法吗?
答案 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}}。