属性工厂豆 vs @PropertySource.



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

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 中访问下面的 bean.java

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

我需要遵循哪种方法,PropertiesFactoryBean和PropertySource有什么区别?

环境的使用:环境为提供属性源提供了方便的界面。属性可以从jvm参数,系统变量,属性文件等加载。恕我直言,使用 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");
...}
}

第三种选择

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

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

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

public class MyServiceImpl{
    @value("${menu.option}")
    String menuItems;
    public List<String> createMenu(){
       //use items directly;
...}
}

最新更新