Spring Boot의 application.properties 파일에 정의 된 값에 액세스하는 방법


312

에 제공된 값에 액세스하고 싶습니다 application.properties. 예 :

logging.level.org.springframework.web: DEBUG
logging.level.org.hibernate: ERROR
logging.file=${HOME}/application.log

userBucket.path=${HOME}/bucket

userBucket.pathSpring Boot 응용 프로그램의 기본 프로그램에 액세스 하고 싶습니다.

답변:


467

@Value주석을 사용하고 사용 중인 Spring Bean의 속성에 액세스 할 수 있습니다

@Value("${userBucket.path}")
private String userBucketPath;

스프링 부트 문서 의 Externalized Configuration 섹션은 필요한 모든 세부 사항을 설명합니다.


5
대안으로서 봄 Environment또는 경유로 도 얻을 수있다@ConfigurationProperties
sodik

3
@sodik의 답변에 덧붙여서, 이것은 환경 을 얻는 방법을 보여주는 예제입니다 stackoverflow.com/questions/28392231/…
cristi

10 개가 넘는 값에 액세스해야하는 경우 예를 10 번 반복해야합니까?
Jesse

한 가지 방법은 그렇게하는 것이지만 번거 롭습니다. @Configuration클래스를 기반으로 한 대체 접근법이 있으며 문제는 다음 블로그 게시물
Master Slave

2
참고 : 이것은 오직 @Component(또는 그 파생물, 즉 그 @Repository
밖의 것들

210

다른 방법은 org.springframework.core.env.Environment콩에 주입 하는 것입니다.

@Autowired
private Environment env;
....

public void method() {
    .....  
    String path = env.getProperty("userBucket.path");
    .....
}

6
또한 속성에 동적으로 액세스해야하는 속성 이름이 변경 될 때 유용합니다.
Paulo Merson

3
속성을 검색하려면 어떻게합니까? 그리고 모두가 환경 패키지 이름, 아마 org.springframework.core.env.Environment 볼 수 있도록 import 문을 포함하여 제안 할 수 있습니다
chrisinmtown

2
잘못된 환경을 가져 오지 않도록주의하십시오. 나는 intellij가 CORBA 환경을 자동으로 가져 왔습니다.
Janac Meena

3
왜 env가 null입니까?
Janac Meena

2
@JanacMeena 대신 IntelliJ 자동 가져 오기 CORBA 클래스와 동일한 문제가 발생했습니다org.springframework.core.env.Environment
Rasshu

31

@ConfigurationProperties의 값에 매핑하는데 사용될 수있다 .properties( .ymlPOJO에도 지원됨).

다음 예제 파일을 고려하십시오.

.properties

cust.data.employee.name=Sachin
cust.data.employee.dept=Cricket

Employee.java

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@ConfigurationProperties(prefix = "cust.data.employee")
@Configuration("employeeProperties")
public class Employee {

    private String name;
    private String dept;

    //Getters and Setters go here
}

이제 employeeProperties다음과 같이 자동 배선 을 통해 속성 값에 액세스 할 수 있습니다 .

@Autowired
private Employee employeeProperties;

public void method() {

   String employeeName = employeeProperties.getName();
   String employeeDept = employeeProperties.getDept();

}

1
나는이 방법을 사용하고 null 반환을 얻었습니다. 속성 파일을 src / test / resources에 넣고 속성 java 클래스 (속성 값이 저장되는)를 src / main / package / properties에 넣습니다. 내가 잃어버린 것? 감사
아마드 레오 Yudanto

src/main/resourcesSpring 테스트에서 코드를 테스트하지 않는 경우 파일을 저장해야합니다 .
JoBⅈN

@AhmadLeoYudanto와 동일하며 그 변경 작업을 수행 할 수있는 작업은 없습니다.
Dimitri Kopriwa

6

현재 다음 세 가지 방법에 대해 알고 있습니다.

1. @Value주석

    @Value("${<property.name>}")
    private static final <datatype> PROPERTY_NAME;
  • 내 경험상 값을 얻지 못하거나로 설정되어있는 상황이 null있습니다. 예를 들어, preConstruct()메소드 또는 메소드 에서 설정하려고 할 때 init(). 이것은 클래스가 완전히 구성된 후에 값 주입이 발생하기 때문에 발생합니다. 그렇기 때문에 3 번째 옵션을 사용하는 것이 좋습니다.

2. @PropertySource주석

<pre>@PropertySource("classpath:application.properties")

//env is an Environment variable
env.getProperty(configKey);</pre>
  • PropertySouceEnvironment클래스가로드 될 때 속성 소스 파일의 값을 변수 (클래스 내)에 설정합니다. 그래서 당신은 쉽게 후문을 가져올 수 있습니다.
    • 시스템 환경 변수를 통해 액세스 할 수 있습니다.

3. @ConfigurationProperties주석.

  • 이것은 주로 Spring 프로젝트에서 구성 속성을로드하는 데 사용됩니다.
  • 속성 데이터를 기반으로 엔터티를 초기화합니다.

    • @ConfigurationProperties 로드 할 특성 파일을 식별합니다.
    • @Configuration 구성 파일 변수를 기반으로 Bean을 작성합니다.
    @ConfigurationProperties (접두사 = "사용자")
    @Configuration ( "UserData")
    수업 사용자 {
      // 속성 및 게터 / 세터
    }
    
    @Autowired
    개인 사용자 데이터 사용자 데이터;
    
    userData.getPropertyName ();

기본 위치가 재정의되면 spring.config.location어떻게됩니까? # 2가 여전히 작동합니까?
bmauter

이 경우 우선 순위가 우선합니다. 명령 줄을 사용하여 spring.config.location을 설정하면 우선 순위가 높아 기존 항목보다 우선합니다.
Dhwanil Patel

5

당신도 이런 식으로 할 수 있습니다 ....

@Component
@PropertySource("classpath:application.properties")
public class ConfigProperties {

    @Autowired
    private Environment env;

    public String getConfigValue(String configKey){
        return env.getProperty(configKey);
    }
}

그런 다음 application.properties에서 읽으려는 경우 키를 getConfigValue 메소드에 전달하십시오.

@Autowired
ConfigProperties configProp;

// Read server.port from app.prop
String portNumber = configProp.getConfigValue("server.port"); 

1
어떤 패키지 Environment입니까?
e-info128

1
여기에서 찾으십시오 : org.springframework.core.env.Environment
lucifer

기본 위치가 재정의되면 spring.config.location어떻게됩니까?
bmauter

3

한 곳에서이 값을 사용 @Value하는 application.properties경우를 사용하여 변수를로드 할 수 있지만보다 집중적 인 방법으로이 변수를로드 @ConfigurationProperties하는 것이 더 좋습니다.

또한 검증 및 비즈니스 로직을 수행하기 위해 다른 데이터 유형이 필요한 경우 변수를로드하고 자동으로 캐스트 할 수 있습니다.

application.properties
custom-app.enable-mocks = false

@Value("${custom-app.enable-mocks}")
private boolean enableMocks;

3

다음과 같이하세요. 1 :-아래와 같이 구성 클래스를 만듭니다.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.beans.factory.annotation.Value;

@Configuration
public class YourConfiguration{

    // passing the key which you set in application.properties
    @Value("${userBucket.path}")
    private String userBucket;

   // getting the value from that key which you set in application.properties
    @Bean
    public String getUserBucketPath() {
        return userBucket;
    }
}

2 :-구성 클래스가 있으면 필요한 구성에서 변수를 주입하십시오.

@Component
public class YourService {

    @Autowired
    private String getUserBucketPath;

    // now you have a value in getUserBucketPath varibale automatically.
}

1
1.Injecting a property with the @Value annotation is straightforward:
@Value( "${jdbc.url}" )
private String jdbcUrl;

2. we can obtain the value of a property using the Environment API

@Autowired
private Environment env;
...
dataSource.setUrl(env.getProperty("jdbc.url"));

1

애플리케이션은 application.properties 파일에서 3 가지 유형의 값을 읽을 수 있습니다.

application.properties


     my.name=kelly

my.dbConnection ={connection_srting:'http://localhost:...',username:'benz',password:'pwd'}

수업 파일

@Value("${my.name}")
private String name;

@Value("#{${my.dbConnection}}")
private Map<String,String> dbValues;

application.properties에 속성이 없으면 기본값을 사용할 수 있습니다

        @Value("${your_name : default value}")
         private String msg; 

0

Spring-boot를 사용하면 외부화 된 구성을 제공하는 몇 가지 방법을 사용할 수 있습니다. 속성 파일 대신 application.yml 또는 yaml 파일을 사용하여 다른 환경에 따라 다른 속성 파일 설정을 제공 할 수 있습니다.

각 환경의 속성을 별도의 스프링 프로필에서 별도의 yml 파일로 분리 할 수 ​​있습니다. 그런 다음 배포 중에 다음을 사용할 수 있습니다.

java -jar -Drun.profiles=SpringProfileName

사용할 스프링 프로파일을 지정하려면 yml 파일의 이름은 다음과 같습니다.

application-{environmentName}.yml

스프링 부트에 의해 자동으로 사용됩니다.

참조 : https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-profile-specific-properties

application.yml 또는 특성 파일에서 읽으려면 다음을 수행하십시오.

가장 쉬운 방법은 특성 파일에서 값을 읽거나 YML 우리가 직접 같은 환경에서 해당 값을 사용할 수 있도록, 스프링 @value의 annotation.Spring 자동으로 봄 환경에 YML에서 모든 값을로드 사용하는 것입니다 :

@Component
public class MySampleBean {

@Value("${name}")
private String sampleName;

// ...

}

또는 스프링이 강력하게 유형이 지정된 Bean을 읽는 데 제공하는 다른 방법은 다음과 같습니다.

YML

ymca:
    remote-address: 192.168.1.1
    security:
        username: admin

yml를 읽는 해당 POJO :

@ConfigurationProperties("ymca")
public class YmcaProperties {
    private InetAddress remoteAddress;
    private final Security security = new Security();
    public boolean isEnabled() { ... }
    public void setEnabled(boolean enabled) { ... }
    public InetAddress getRemoteAddress() { ... }
    public void setRemoteAddress(InetAddress remoteAddress) { ... }
    public Security getSecurity() { ... }
    public static class Security {
        private String username;
        private String password;
        public String getUsername() { ... }
        public void setUsername(String username) { ... }
        public String getPassword() { ... }
        public void setPassword(String password) { ... }
    }
}

위의 방법은 yml 파일과 잘 작동합니다.

참조 : https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html


0

나를 위해, 위의 어느 것도 나를 위해 직접 일하지 않았습니다. 내가 한 일은 다음과 같습니다.

또한 @Rodrigo Villalba Zayas에 대답
implements InitializingBean하면 클래스에 추가
하고 메소드를 구현했습니다.

@Override
public void afterPropertiesSet() {
    String path = env.getProperty("userBucket.path");
}

그렇게 보일 것입니다

import org.springframework.core.env.Environment;
public class xyz implements InitializingBean {

    @Autowired
    private Environment env;
    private String path;

    ....

    @Override
    public void afterPropertiesSet() {
        path = env.getProperty("userBucket.path");
    }

    public void method() {
        System.out.println("Path: " + path);
    }
}

0

속성 값을 얻는 가장 좋은 방법은 사용하고 있습니다.

1. 값 주석 사용

@Value("${property.key}")
private String propertyKeyVariable;

2. 환경 빈 사용

@Autowired
private Environment env;

public String getValue() {
    return env.getProperty("property.key");
}

public void display(){
  System.out.println("# Value : "+getValue);
}

0

가장 좋은 방법은 @Value주석 을 사용 하여 객체에 자동으로 값을 할당하는 것 private Environment en입니다. 이렇게하면 코드가 줄어들고 파일을 쉽게 필터링 할 수 있습니다.


0

두 가지 방법이 있습니다

  1. @Value수업에서 직접 사용할 수 있습니다
    @Value("#{'${application yml field name}'}")
    public String ymlField;

또는

  1. 그것을 깨끗하게하기 위해 @Configuration모든 것을 추가 할 수있는 수업을 청소 할 수 있습니다@value
@Configuration
public class AppConfig {

    @Value("#{'${application yml field name}'}")
    public String ymlField;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.