답변:
@Value
주석을 사용하고 사용 중인 Spring Bean의 속성에 액세스 할 수 있습니다
@Value("${userBucket.path}")
private String userBucketPath;
스프링 부트 문서 의 Externalized Configuration 섹션은 필요한 모든 세부 사항을 설명합니다.
@Configuration
클래스를 기반으로 한 대체 접근법이 있으며 문제는 다음 블로그 게시물
@Component
(또는 그 파생물, 즉 그 @Repository
다른 방법은 org.springframework.core.env.Environment
콩에 주입 하는 것입니다.
@Autowired
private Environment env;
....
public void method() {
.....
String path = env.getProperty("userBucket.path");
.....
}
org.springframework.core.env.Environment
@ConfigurationProperties
의 값에 매핑하는데 사용될 수있다 .properties
( .yml
POJO에도 지원됨).
다음 예제 파일을 고려하십시오.
.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();
}
src/main/resources
Spring 테스트에서 코드를 테스트하지 않는 경우 파일을 저장해야합니다 .
현재 다음 세 가지 방법에 대해 알고 있습니다.
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>
PropertySouce
Environment
클래스가로드 될 때 속성 소스 파일의 값을 변수 (클래스 내)에 설정합니다. 그래서 당신은 쉽게 후문을 가져올 수 있습니다.
3. @ConfigurationProperties
주석.
속성 데이터를 기반으로 엔터티를 초기화합니다.
@ConfigurationProperties
로드 할 특성 파일을 식별합니다.@Configuration
구성 파일 변수를 기반으로 Bean을 작성합니다.@ConfigurationProperties (접두사 = "사용자") @Configuration ( "UserData") 수업 사용자 { // 속성 및 게터 / 세터 } @Autowired 개인 사용자 데이터 사용자 데이터; userData.getPropertyName ();
spring.config.location
어떻게됩니까? # 2가 여전히 작동합니까?
당신도 이런 식으로 할 수 있습니다 ....
@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");
Environment
입니까?
spring.config.location
어떻게됩니까?
한 곳에서이 값을 사용 @Value
하는 application.properties
경우를 사용하여 변수를로드 할 수 있지만보다 집중적 인 방법으로이 변수를로드 @ConfigurationProperties
하는 것이 더 좋습니다.
또한 검증 및 비즈니스 로직을 수행하기 위해 다른 데이터 유형이 필요한 경우 변수를로드하고 자동으로 캐스트 할 수 있습니다.
application.properties
custom-app.enable-mocks = false
@Value("${custom-app.enable-mocks}")
private boolean enableMocks;
다음과 같이하세요. 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.
}
애플리케이션은 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;
Spring-boot를 사용하면 외부화 된 구성을 제공하는 몇 가지 방법을 사용할 수 있습니다. 속성 파일 대신 application.yml 또는 yaml 파일을 사용하여 다른 환경에 따라 다른 속성 파일 설정을 제공 할 수 있습니다.
각 환경의 속성을 별도의 스프링 프로필에서 별도의 yml 파일로 분리 할 수 있습니다. 그런 다음 배포 중에 다음을 사용할 수 있습니다.
java -jar -Drun.profiles=SpringProfileName
사용할 스프링 프로파일을 지정하려면 yml 파일의 이름은 다음과 같습니다.
application-{environmentName}.yml
스프링 부트에 의해 자동으로 사용됩니다.
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);
}
Environment
또는 경유로 도 얻을 수있다@ConfigurationProperties