속성 파일에서 값을 읽는 방법은 무엇입니까?


133

나는 봄을 사용하고 있습니다. 속성 파일에서 값을 읽어야합니다. 외부 특성 파일이 아닌 내부 특성 파일입니다. 속성 파일은 다음과 같습니다.

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

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

전통적인 방식이 아닌 속성 파일에서 해당 값을 읽어야합니다. 그것을 달성하는 방법? 스프링 3.0에 대한 최신 접근 방식이 있습니까?


7
이것은 특성 파일 처럼 보이지 않습니다 .
Raghuram

Java 의미의 특성 파일 인 경우-예. 그렇지 않으면 그것은 다르게 취급되어야하는 커스텀 파일 형식입니다 (그리고 키가 없다면 Spring에서 속성 값으로 줄을 사용할 수 없습니다).
Hauke ​​Ingmar Schmidt

3
"전통적인 방식이 아님"-이것의 의미는 무엇입니까?
Hauke ​​Ingmar Schmidt

나 ... XML 구성을 사용하여 annotations..not 의미
user1016403

답변:


196

컨텍스트에서 PropertyPlaceholder를 구성하십시오.

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

그런 다음 Bean의 특성을 참조하십시오.

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

편집 : 쉼표로 구분 된 여러 값으로 속성을 구문 분석하도록 코드를 업데이트했습니다.

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>

그리고 콩 :

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

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

안녕하세요 mrembisz, 답장을 보내 주셔서 감사합니다. 외부 속성 파일에서 값을 읽도록 속성 자리 표시자를 이미 구성했습니다. 하지만 resources 폴더 안에 하나의 속성 파일이 있습니다. 읽고 주사해야합니다. 모든 값을 목록에 주입해야합니다. 감사!
user1016403

@Ethan이 제안한대로 편집했습니다. 업데이트 해 주셔서 감사합니다. 원본 편집을 수락 할 수 없습니다. 이미 너무 늦었습니다.
mrembisz

2
쉼표로 구분 된 값을 처리하는 경우 EL을 사용하여 여기에서 제안되는 사항을 고려하십시오. stackoverflow.com/questions/12576156/…
arcseldon

2
우리는 어떻게 사용 aaa합니까? @Value(${aaa}) private String aaa;그렇다면 우리는 할 수 있습니까 System.out.println(aaa)???????

2
보다 정확하게 @Value("${aaa}")는 인용 부호를 염두에 두십시오. 그리고 네, 생성자가 값이 주입되기 전에 실행되기 때문에 생성자가 아닌 것을 제외하고 인쇄 할 수 있습니다.
mrembisz

48

이를 달성하는 데는 여러 가지 방법이 있습니다. 다음은 봄에 일반적으로 사용되는 몇 가지 방법입니다.

  1. PropertyPlaceholderConfigurer 사용

  2. PropertySource 사용

  3. ResourceBundleMessageSource 사용

  4. PropertiesFactoryBean 사용

    그리고 더 많은........................

ds.type속성 파일의 핵심 이라고 가정 하십시오.


사용 PropertyPlaceholderConfigurer

PropertyPlaceholderConfigurer콩 등록

<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, 나는 좋은 발견 링크 버전 compatibility-을 이해하기를

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

사용 ResourceBundleMessageSource

콩 등록

<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 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");
    }
}

PropertySourcesPlaceholderConfigurer를 사용하려면 일반적으로 위치 또는 리소스를 설정해야합니다. 그렇지 않으면 속성 파일에 액세스 할 수 없습니다. 예를 들어 ClassPathResource generalProperties = new ClassPathResource ( "general.properties");
M46

43

구성 클래스에서

@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;
   }
}

이 예에서는 단순히 app.properties프로덕션 대 테스트에서 다른 것을 사용 하시겠습니까? 다시 말해서, 배포 프로세스의 일부 app.properties가 프로덕션 값 으로 대체 되는 것입니까?
케빈 메러디스

1
@KevinMeredith 예, 프로필 주석으로 스프링 구성을 분할 할 수 있습니다. stackoverflow.com/questions/12691812/…
mokshino

@KevinMeredith는 c : \ apps \ sys_name \ conf \ app.properties와 같이 deploy war 외부의 폴더를 사용합니다. 배포 프로세스가 단순화되고 오류가 덜 발생합니다.
jpfreire

27

여기에 그것이 어떻게 작동했는지 이해하는 데 도움이되는 추가 답변이 있습니다 : http://www.javacodegeeks.com/2013/07/spring-bean-and-propertyplaceholderconfigurer.html

모든 BeanFactoryPostProcessor Bean은 static , modifier 로 선언해야합니다.

@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();
 }
}

PropertySourcesPlaceholderConfigurerBean 을 명시 적으로 등록 할 필요가 없습니다@PropertySource

@ dubey-theHarcourtians 어떤 Spring (core) 버전을 사용하십니까? Spring Boot를 사용한다면 @PropertySource전혀 필요하지 않습니다 .
Michael Técourt

11

@Value를 사용하지 않고 속성 파일을 수동으로 읽어야하는 경우

Lokesh Gupta의 잘 작성된 페이지에 감사드립니다 : 블로그

여기에 이미지 설명을 입력하십시오

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;
    }
}

고마워, 그것은 내 경우에 작동합니다. 정적 함수에서 속성을 읽어야합니다.
Trieu Nguyen


4

다른 방법은 ResourceBundle을 사용하는 것 입니다. 기본적으로 '.properties'없이 이름을 사용하여 번들을 얻습니다.

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

그리고 이것을 사용하여 모든 가치를 회복하십시오.

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

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>

설명을 추가하십시오
HaveNoDisplayName

XSI : UTIL, XSI :의 schemaLocation, XMLNS 당신이 ApplicationContext를 같이 사용하는 J2EE 컨테이너에 필요, 당신은 콩에게 XMLNS, XMLNS 같은 수준의 검증을 사용할 필요가 있도록, 당신이하지 액세스 외부 리소스 속성 파일 할 수있는 핵심 컨테이너를 사용
Sangram BADI


0

나는 더 봄 주석이 좋아하는 없습니다, 그래서 스프링에 의해 관리되지 않는 유틸리티 클래스를 원했다 @Component, @Configuration등등하지만에서 읽을 수있는 클래스를 원했다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 현재 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);
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.