PropertiesFactoryBean vs @PropertySource

时间:2015-04-16 16:34:27

标签: java spring spring-mvc spring-annotations properties-file

我只需要在类MyServiceImpl.java中读取menu.properties文件 这些值不是特定于环境的。

menu.properties
----------------
menu.option=option1,option2,option3

1)使用@PropertySource

@Configuration
@ComponentScan(basePackages = { "com.test.*" })
@PropertySource("classpath:menu.properties")
public class MyServiceImpl{

    @Autowired
    private Environment env;
    public List<String> createMenu(){
       String menuItems = env.getProperty("menu.option");
...}
}

2)如何访问MyServiceImpl.java中的下面的bean

<bean id="properties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="location" value="classpath:menu.properties"/>
</bean>

我需要遵循哪种方法,以及PropertiesFactoryBean和PropertySource之间的区别是什么?

1 个答案:

答案 0 :(得分:1)

使用环境 环境为提供属性源提供了方便的界面。可以从jvm args,系统变量,属性文件等加载属性。使用env提供更好的抽象恕我直言。

给定一个选择我更喜欢Environment,因为它提供了更好的抽象。明天可以从jvm参数或系统变量加载属性文件,而不是属性文件,接口将保持不变。

回答第二个问题(我也提供了简短表格)。

长篇:

<bean id="properties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="location" value="classpath:menu.properties"/>
</bean>

简短形式:

<util:properties id="properties" location="classpath:menu.properties"/>

public class MyServiceImpl{

    @Autowired
    private Properties properties;
    public List<String> createMenu(){
       String menuItems = properties.getProperty("menu.option");
...}
}

第三个选项

如果您要直接读取属性,如果没有特定于环境,我建议使用注册PropertySourcesPlaceholderConfigurer的<context:property-placeholder>

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

如果您按上述方式声明,则可以使用@value注释直接读取值,如下所示。

public class MyServiceImpl{

    @value("${menu.option}")
    String menuItems;

    public List<String> createMenu(){
       //use items directly;
...}

}