如何从属性文件中读取值?

时间:2012-02-13 11:38:33

标签: spring properties-file

我正在使用春天。我需要从属性文件中读取值。这是内部属性文件而不是外部属性文件。属性文件可以如下所示。

some.properties ---file name. values are below.

abc = abc
def = dsd
ghi = weds
jil = sdd

我需要以传统方式从属性文件中读取这些值。怎么实现呢?有没有关于spring 3.0的最新方法?

10 个答案:

答案 0 :(得分:182)

在您的上下文中配置PropertyPlaceholder:

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

然后引用bean中的属性:

@Component
class MyClass {
  @Value("${my.property.name}")
  private String[] myValues;
}

编辑:使用mutliple逗号分隔值更新代码以解析属性:

my.property.name=aaa,bbb,ccc

如果这不起作用,您可以使用属性定义一个bean,手动注入并处理它:

<bean id="myProperties"
      class="org.springframework.beans.factory.config.PropertiesFactoryBean">
  <property name="locations">
    <list>
      <value>classpath*:my.properties</value>
    </list>
  </property>
</bean>

和bean:

@Component
class MyClass {
  @Resource(name="myProperties")
  private Properties myProperties;

  @PostConstruct
  public void init() {
    // do whatever you need with properties
  }
}

答案 1 :(得分:39)

在配置类

@Configuration
@PropertySource("classpath:/com/myco/app.properties")
public class AppConfig {
   @Autowired
   Environment env;

   @Bean
   public TestBean testBean() {
       TestBean testBean = new TestBean();
       testBean.setName(env.getProperty("testbean.name"));
       return testBean;
   }
}

答案 2 :(得分:34)

有各种方法可以达到同样的目的。以下是春季常用的一些方法 -

  1. 使用PropertyPlaceholderConfigurer
  2. 使用PropertySource
  3. 使用ResourceBundleMessageSource
  4. 使用PropertiesFactoryBean

    还有更多........................

  5. 假设ds.type是您的媒体资源中的关键。

    使用PropertyPlaceholderConfigurer

    注册PropertyPlaceholderConfigurer bean -

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

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
      <property name="locations" value="classpath:path/filename.properties" ></property>
    </bean>
    

    @Configuration
    public class SampleConfig {
     @Bean
     public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() {
      return new PropertySourcesPlaceholderConfigurer();
      //set locations as well.
     }
    }
    

    注册PropertySourcesPlaceholderConfigurer后,您可以访问值 -

    @Value("${ds.type}")private String attr; 
    

    使用PropertySource

    在最新的春季版本中,您不需要使用PropertyPlaceHolderConfigurer注册@PropertySource,我找到了一个很好的link来了解版本兼容性 -

    @PropertySource("classpath:path/filename.properties")
    @Component
    public class BeanTester {
        @Autowired Environment environment; 
        public void execute() {
            String attr = this.environment.getProperty("ds.type");
        }
    }
    

    使用ResourceBundleMessageSource

    注册Bean -

    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
      <property name="basenames">
        <list>
          <value>classpath:path/filename.properties</value>
        </list>
      </property>
    </bean>
    

    访问价值 -

    ((ApplicationContext)context).getMessage("ds.type", null, null);
    

    @Component
    public class BeanTester {
        @Autowired MessageSource messageSource; 
        public void execute() {
            String attr = this.messageSource.getMessage("ds.type", null, null);
        }
    }
    

    使用PropertiesFactoryBean

    注册Bean -

    <bean id="properties"
          class="org.springframework.beans.factory.config.PropertiesFactoryBean">
      <property name="locations">
        <list>
          <value>classpath:path/filename.properties</value>
        </list>
      </property>
    </bean>
    

    将属性实例连接到您的班级 -

    @Component
    public class BeanTester {
        @Autowired Properties properties; 
        public void execute() {
            String attr = properties.getProperty("ds.type");
        }
    }
    

答案 3 :(得分:25)

这是一个额外的答案,对我理解其工作原理也很有帮助:http://www.javacodegeeks.com/2013/07/spring-bean-and-propertyplaceholderconfigurer.html

  

必须使用 static ,修饰符

声明任何BeanFactoryPostProcessor bean
@Configuration
@PropertySource("classpath:root/test.props")
public class SampleConfig {
 @Value("${test.prop}")
 private String attr;
 @Bean
 public SampleService sampleService() {
  return new SampleService(attr);
 }

 @Bean
 public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() {
  return new PropertySourcesPlaceholderConfigurer();
 }
}

答案 4 :(得分:7)

如果您需要在不使用@Value的情况下手动阅读属性文件。

感谢Lokesh Gupta精心撰写的页面:Blog

enter image description here

package utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ResourceUtils;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.io.File;


public class Utils {

    private static final Logger LOGGER = LoggerFactory.getLogger(Utils.class.getName());

    public static Properties fetchProperties(){
        Properties properties = new Properties();
        try {
            File file = ResourceUtils.getFile("classpath:application.properties");
            InputStream in = new FileInputStream(file);
            properties.load(in);
        } catch (IOException e) {
            LOGGER.error(e.getMessage());
        }
        return properties;
    }
}

答案 5 :(得分:6)

您需要在应用程序上下文中放置PropertyPlaceholderConfigurer bean并设置其位置属性。

请在此处查看详细信息:http://www.zparacha.com/how-to-read-properties-file-in-spring/

您可能需要稍微修改属性文件才能使此工作正常工作。

希望它有所帮助。

答案 6 :(得分:1)

另一种方法是使用ResourceBundle。基本上,您使用不带'.properties'的名称获取捆绑包。

private static final ResourceBundle resource = ResourceBundle.getBundle("config");

您可以使用以下方法恢复任何值:

private final String prop = resource.getString("propName");

答案 7 :(得分:0)

 [project structure]: http://i.stack.imgur.com/RAGX3.jpg
-------------------------------
    package beans;

        import java.util.Properties;
        import java.util.Set;

        public class PropertiesBeans {

            private Properties properties;

            public void setProperties(Properties properties) {
                this.properties = properties;
            }

            public void getProperty(){
                Set keys = properties.keySet();
                for (Object key : keys) {
                    System.out.println(key+" : "+properties.getProperty(key.toString()));
                }
            }

        }
    ----------------------------

        package beans;

        import org.springframework.context.ApplicationContext;
        import org.springframework.context.support.ClassPathXmlApplicationContext;

        public class Test {

            public static void main(String[] args) {
                // TODO Auto-generated method stub
                ApplicationContext ap = new ClassPathXmlApplicationContext("resource/spring.xml");
                PropertiesBeans p = (PropertiesBeans)ap.getBean("p");
                p.getProperty();
            }

        }
    ----------------------------

 - driver.properties

    Driver = com.mysql.jdbc.Driver
    url = jdbc:mysql://localhost:3306/test
    username = root
    password = root
    ----------------------------



     <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:util="http://www.springframework.org/schema/util"
               xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">

            <bean id="p" class="beans.PropertiesBeans">
                <property name="properties">
                    <util:properties location="classpath:resource/driver.properties"/>
                </property>
            </bean>

        </beans>

答案 8 :(得分:0)

我建议您阅读SpringBoot文档中有关注入外部配置的链接https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html。他们并不只是谈论从属性文件中检索,而是谈论YAML甚至是JSON文件。我发现它很有帮助。我希望你也这样做。

答案 9 :(得分:0)

我想要一个不受spring管理的实用程序类,因此没有@Component@Configuration等spring注释。但是我希望该类从application.properties读取

我设法通过使类了解Spring Context,从而了解了Environment,从而使environment.getProperty()正常工作来使它工作。

明确地说,我有:

application.properties

mypath=somestring

Utils.java

import org.springframework.core.env.Environment;

// No spring annotations here
public class Utils {
    public String execute(String cmd) {
        // Making the class Spring context aware
        ApplicationContextProvider appContext = new ApplicationContextProvider();
        Environment env = appContext.getApplicationContext().getEnvironment();

        // env.getProperty() works!!!
        System.out.println(env.getProperty("mypath")) 
    }
}

ApplicationContextProvider.java (请参见Spring get current ApplicationContext

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class ApplicationContextProvider implements ApplicationContextAware {
    private static ApplicationContext CONTEXT;

    public ApplicationContext getApplicationContext() {
        return CONTEXT;
    }

    public void setApplicationContext(ApplicationContext context) throws BeansException {
        CONTEXT = context;
    }

    public static Object getBean(String beanName) {
        return CONTEXT.getBean(beanName);
    }
}