我需要知道下面两种加载属性文件的方法之间的区别。
方法-1
<context:property-placeholder location="classpath:constants.properties"/>
方法-2
<context:component-scan base-package="com.snippets.enterprise"/>
package com.snippets.enterprise;
@Configuration
@PropertySource("classpath:/constants.properties")
public class SpringConfig {}
我在方法中看到两个键,并且在加载应用程序上下文时可以使用值。 但是在
加载应用程序上下文时,接近一个键的属性不可用,并且显示
找不到键。请让我知道这两种方法的不同之处。
使用应用程序上下文加载属性文件时。
当键,属性文件的值在容器中初始化。
答案 0 :(得分:5)
两者实际上都很独立。让我根据我的理解尝试澄清:
使用context:property-placeholder
的方法1注册一个组件,该组件可以解析bean定义中${propertyname}
形式的占位符。
而@PropertySource
注释会为活动Spring environment提供属性。
现在,回到方法1,context:property-placeholder
实际上足够聪明,知道它不仅需要查看通过其location
属性注册的属性,还要查看可用的属性。当前的活动环境(通过@PropertySource
注释添加了属性,如方法2中所示。)
因此,如果您希望继续解析占位符,则需要将approach1与approach2一起使用。
另一方面,如果您想要专门使用方法2,那么最好的方法是在需要属性的环境中注入并以这种方式显式查找属性:
@Component
public class MyBean {
@Autowired
private Environment environment;
public void mymethod() {
..
environment.getProperty("mykey");
}
}