development

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

big-blog 2020. 4. 2. 08:15
반응형

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


에 제공된 값에 액세스하고 싶습니다 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 응용 프로그램의 기본 프로그램에 액세스 하고 싶습니다.


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

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

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


다른 방법은 Bean에 환경을 주입하는 것입니다.

@Autowired
private Environment env;
....

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

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

}

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

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

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

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

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

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

현재 저는 세 가지 방법을 따르는 것에 대해 알고 있습니다.

  1. @ 값 주석

    @Value("${<proparty.name>}")
    private static final <datatype> PROPERTY_NAME;
    
    • 내 경험에 따르면 프로세스가 진행 중이거나 디버그 시간이되면 가치를 얻지 못하거나 null이되는 상황이 있습니다. 예를 들어, 일부 preConstruct () 또는 일부 init () 메소드에서 설정하려고하면 (이것은 주석이 달린 변수가로드되기 전에 호출 되었기 때문입니다.)이 상황은 3 번째 옵션을 사용하는 것이 좋습니다.
  2. @PropertySource :

    @PropertySource ( "classpath : application.properties")
    
    // env는 환경 변수입니다
    env.getProperty (configKey);
    • PropertySouce는 프로젝트로드시 시스템 환경 변수에서 속성 파일의 변수를 설정합니다. 그래서 당신은 쉽게 후문을 가져올 수 있습니다.
      • 시스템 환경 변수를 통해 액세스 할 수 있습니다.
  3. @ConfigurationProperties

    • 이 경우는 약간 다르지만 대부분 Spring MVC 프로젝트에서로드 구성 속성에 사용됩니다.
    • 속성 데이터를 기반으로 엔터티를 만드는 원칙에 따라 작동합니다. (일반적으로 일부 기본 데이터로 엔티티를로드 할 때)
    • @ConfigurationProperties는로드 구성 파일입니다.
    • @Configuration은 구성 파일 변수를 기반으로 엔터티를 만듭니다.
    @ConfigurationProperties (접두사 = "사용자")
    @Configuration ( "UserData")
    수업 사용자 {
      // 속성 및 게터 / 세터
    }
    
    @Autowired
    개인 사용자 데이터 사용자 데이터;
    
    userData.getPropertyName ();

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


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

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

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

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

참고 URL : https://stackoverflow.com/questions/30528255/how-to-access-a-value-defined-in-the-application-properties-file-in-spring-boot

반응형