복붙노트

[SPRING] @PropertySource를 사용한 Spring 속성 설정

SPRING

@PropertySource를 사용한 Spring 속성 설정

아래 Spring 구성 클래스에서 @PropertySource를 통해 app.properties 파일을로드하고 속성 파일의 구성을 사용하여 두 가지 DBCP 데이터 소스를 구성합니다.

모든 것이 잘 작동하지만 데이터 소스를 생성하기 위해 주석을 사용하여 각 구성 속성에 대한 변수를 선언하는 것을 좋아하지 않습니다. 이런 환경 클래스를 autowire하려고했습니다.

@Autowired Environment env;

다만, env.getProperty ()가 null를 돌려주는 경우. 이 작업을 수행하는 더 좋은 방법이 있습니까?

@Configuration
@PropertySource("classpath:app.properties")
public class DAOConfig {
    @Value( "${txn.dbhost}" ) private String txnDbHost;
    @Value( "${txn.dbport}" ) private Integer txnDbPort;
    @Value( "${txn.dbservice}" ) private String txnDbService;
    @Value( "${txn.dbuser}" ) private String txnDbUser;
    @Value( "${txn.dbpwd}" ) private String txnDbPwd;

    @Value( "${rpt.dbhost}" ) private String rptDbHost;
    @Value( "${rpt.dbport}" ) private Integer rptDbPort;
    @Value( "${rpt.dbservice}" ) private String rptDbService;
    @Value( "${rpt.dbuser}" ) private String rptDbUser;
    @Value( "${rpt.dbpwd}" ) private String rptDbPwd;

    @Bean(destroyMethod = "close")
    public DataSource txnDataSource() {
        return new DataSources.Builder()
                .host(txnDbHost)
                .port(txnDbPort)
                .service(txnDbService)
                .user(txnDbUser)
                .pwd(txnDbPwd)
                .build();
    }

    @Bean(destroyMethod = "close")
    public DataSource rptDataSource() {
        return new DataSources.Builder()
                .host(rptDbHost)
                .port(rptDbPort)
                .service(rptDbService)
                .user(rptDbUser)
                .pwd(rptDbPwd)
                .build();
    }
}

편집 : 나는 Environment.getProperty ()에 대해 다시 작동하지 않습니다. 실제로 작동합니다. 나는 재산 이름을 잘못주고 있었다. Spring Boot를 사용하고 싶지 않은 사용자는 다음과 같이 Environment를 autowire 할 수 있습니다.

@Configuration
@PropertySource("classpath:app.properties")
public class DAOConfig {
    @Autowired Environment env;

    @Bean(destroyMethod = "close")
    public DataSource txnDataSource() {
        return new DataSources.Builder()
                .host(env.getProperty("txn.dbhost"))
                .port(env.getProperty("txn.dbport"))
                .service(env.getProperty("txn.dbservice"))
                .user(env.getProperty("txn.dbuser"))
                .pwd(env.getProperty("txn.dbpwd"))
                .build();
    }

}

해결법

  1. ==============================

    1.Spring Boot를 사용하고 있다면 (또는 사용하고자한다면) @ConfigurationProperties 주석을 사용할 수 있습니다.

    Spring Boot를 사용하고 있다면 (또는 사용하고자한다면) @ConfigurationProperties 주석을 사용할 수 있습니다.

    다음은 스프링 부트 소스 코드의 예제입니다.

    @ConfigurationProperties(prefix = "spring.activemq")
    public class ActiveMQProperties {
    
        private String brokerUrl = "tcp://localhost:61616";
    
        private boolean inMemory = true;
    
        private boolean pooled = false;
    
        private String user;
    
        private String password;
    
        // Will override brokerURL if inMemory is set to true
        public String getBrokerUrl() {
            if (this.inMemory) {
                return "vm://localhost";
            }
            return this.brokerUrl;
        }
    
        public void setBrokerUrl(String brokerUrl) {
            this.brokerUrl = brokerUrl;
        }
    
        public boolean isInMemory() {
            return this.inMemory;
        }
    
        public void setInMemory(boolean inMemory) {
            this.inMemory = inMemory;
        }
    
        public boolean isPooled() {
            return this.pooled;
        }
    
        public void setPooled(boolean pooled) {
            this.pooled = pooled;
        }
    
        public String getUser() {
            return this.user;
        }
    
        public void setUser(String user) {
            this.user = user;
        }
    
        public String getPassword() {
            return this.password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
    }
    

    실제로 이것은 spring.activemq. * 속성을 해당 속성으로 매핑합니다.

    이전 종류의 코드를 사용하면 각 필드에서 @Value를 사용해야합니다.

    표시된 특정 DataSource 예제에서 Spring Boot는 버전 1.1.0.M1에서 DataSourceBuilder를 제공하며 @ConfigurationProperties를 기반으로 구현하려는 구성 유형을 대폭 단순화합니다. 여기에서 설명서를 참조하십시오.

    귀하의 경우 코드는 다음과 같습니다.

    @Bean
    @ConfigurationProperties(prefix="txn")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }
    
    @Bean
    @ConfigurationProperties(prefix="rpt")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }
    
  2. from https://stackoverflow.com/questions/23981670/spring-properties-configuration-using-propertysource by cc-by-sa and MIT license