SpringBoot 설정 파일 주입 3 가지 방법 상세 설명

이 글 은 주로 SpringBoot 가 프로필 을 주입 하 는 세 가지 방법 에 대한 상세 한 설명 을 소개 하 였 으 며,예시 코드 를 통 해 매우 상세 하 게 소개 하 였 으 며,여러분 의 학습 이나 업무 에 대해 어느 정도 참고 학습 가 치 를 가지 고 있 으 므 로 필요 한 분 들 은 참고 하 시기 바 랍 니 다.
프로젝트 1:@ConfigurationProperties+@Component

  spring     bean        ,               bean

/**
 *                 ,        
 * @ConfigurationProperties:  SpringBoot                        ;
 *   prefix = "person":                    
 *
 *              ,       @ConfigurationProperties  ;
 *
 */
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
​
  private String lastName;
  private Integer age;
  private Boolean boss;
  private Date birth;
​
  private Map<String,Object> maps;
  private List<Object> lists;
  private Dog dog;
방안 2:@Bean+@ConfigurationProperties
@ConfigurationProperties 를@bean 의 주해 에 직접 정의 할 수 있 습 니 다.이것 은 bean 실체 류 이 므 로@Component 와@ConfigurationProperties 를 사용 하지 않 습 니 다.여 기 는 Boot 의 동적 데이터 원본 전환 클래스 입 니 다.

package com.topcheer.oss.base.datasource;
​
import com.alibaba.druid.pool.DruidDataSource;
​
import com.xiaoleilu.hutool.crypto.symmetric.SymmetricAlgorithm;
import com.xiaoleilu.hutool.crypto.symmetric.SymmetricCrypto;
import com.xiaoleilu.hutool.util.CharsetUtil;
import com.xiaoleilu.hutool.util.HexUtil;
​
import lombok.extern.slf4j.Slf4j;
​
@Slf4j
public class UmspscDataSource extends DruidDataSource {
​
  private static final long serialVersionUID = 4766401181052251539L;
​
  private String passwordDis;
  
  /**
   *   
   */
  private final static String Pkey ="1234565437892132";
  
  @Override
  public String getPassword() {
    if(passwordDis != null && passwordDis.length() > 0) {
      return passwordDis;
    }
    String encPassword = super.getPassword();
    if(null == encPassword) {
      return null;
    }
    log.info("        ,{" + encPassword + "}");
    try {
      //     ,        
      String key = HexUtil.encodeHexStr(Pkey);
      SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key.getBytes());
      passwordDis = aes.decryptStr(encPassword, CharsetUtil.CHARSET_UTF_8);
      return passwordDis;
    } catch (Exception e) {
      log.error("         ,{"+encPassword + "}");
      //log.error(LogUtil.e(e));
      //throw new Exception("         !", e);
      return null;
    }
  }
}

@Bean(name = "systemDataSource")
  @ConfigurationProperties(ignoreUnknownFields = false, prefix = "spring.datasource.system")
  public DataSource systemDataSource() {
    return new UmspscDataSource();
  }
​
  @Bean(name = "secondDataSource")
  @ConfigurationProperties(ignoreUnknownFields = false, prefix = "spring.datasource.second")
  public DataSource secondDataSource() {
    return new UmspscDataSource();
  }
  
  @Bean(name="systemJdbcTemplate")
  public JdbcTemplate systemJdbcTemplate(
      @Qualifier("systemDataSource") DataSource dataSource) {
    return new JdbcTemplate(dataSource);
  }
  
  @Bean(name="secondJdbcTemplate")
  public JdbcTemplate secondJdbcTemplate(
      @Qualifier("secondDataSource") DataSource dataSource) {
    return new JdbcTemplate(dataSource);
  }
프로젝트 3:@ConfigurationProperties+@EnableConfigurationProperties
우 리 는 위의 예 와 같이 속성 을 설명 한 다음 에 Spring 의@Autowire 로 mail configuration bean 을 주입 합 니 다.

package com.dxz.property;
​
import org.springframework.boot.context.properties.ConfigurationProperties;
​
@ConfigurationProperties(locations = "classpath:mail.properties", ignoreUnknownFields = false, prefix = "mail")
public class MailProperties {
  private String host;
  private int port;
  private String from;
  private String username;
  private String password;
  private Smtp smtp;
​
  // ... getters and setters
  public String getHost() {
    return host;
  }
​
  public void setHost(String host) {
    this.host = host;
  }
​
  public int getPort() {
    return port;
  }
​
  public void setPort(int port) {
    this.port = port;
  }
​
  public String getFrom() {
    return from;
  }
​
  public void setFrom(String from) {
    this.from = from;
  }
​
  public String getUsername() {
    return username;
  }
​
  public void setUsername(String username) {
    this.username = username;
  }
​
  public String getPassword() {
    return password;
  }
​
  public void setPassword(String password) {
    this.password = password;
  }
​
  public Smtp getSmtp() {
    return smtp;
  }
​
  public void setSmtp(Smtp smtp) {
    this.smtp = smtp;
  }
  
  @Override
  public String toString() {
    return "MailProperties [host=" + host + ", port=" + port + ", from=" + from + ", username=" + username
        + ", password=" + password + ", smtp=" + smtp + "]";
  }
​
  public static class Smtp {
    private boolean auth;
    private boolean starttlsEnable;
​
    public boolean isAuth() {
      return auth;
    }
​
    public void setAuth(boolean auth) {
      this.auth = auth;
    }
​
    public boolean isStarttlsEnable() {
      return starttlsEnable;
    }
​
    public void setStarttlsEnable(boolean starttlsEnable) {
      this.starttlsEnable = starttlsEnable;
    }
  }
}
시작 클래스 및 테스트 클래스:

package com.dxz.property;
​
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
​
@RestController
@SpringBootApplication
@EnableConfigurationProperties(MailProperties.class)
public class TestProperty1 {
​
  @Autowired
  private MailProperties mailProperties;
  
  @RequestMapping(value = "/hello", method = RequestMethod.GET)
  @ResponseBody
  public String hello() {
    System.out.println("mailProperties" + mailProperties);
    return "hello world";
  }
​
  public static void main(String[] args) {
    //SpringApplication.run(TestProperty1.class, args);
    new SpringApplicationBuilder(TestProperty1.class).web(true).run(args);
​
  }
}
결과:

@EnableConfigurationProperties 설명 을 주의 하 십시오.이 설명 은@ConfigurationProperties 주석 설정 Bean 에 대한 지원 을 시작 하 는 데 사 용 됩 니 다.즉,@EnableConfigurationProperties 주 해 는 Spring Boot 가@ConfigurationProperties 를 지원 할 수 있 음 을 알려 줍 니 다.지정 하지 않 으 면 다음 과 같은 이상 을 볼 수 있 습 니 다:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.dxz.property.MailProperties] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
주의:다른 방법 도 있 습 니 다.(Spring Boot 는 항상 다른 방법 이 있 습 니 다!)@ConfigurationProperties beans 를 C 용@Configuration 또는@Component 주석 으로 추가 하면 component scan 에서 발견 할 수 있 습 니 다.
 
@ConfigurationProperties
@Value
기능.
설정 파일 의 속성 을 일괄 주입 합 니 다.
하나하나 지정 하 다
느슨 한 귀속(느슨 한 문법)
지지 하 다.
지지 하지 않 음
SpEL
지지 하지 않 음
지지 하 다.
JSR 303 데이터 검증
지지 하 다.
지지 하지 않 음
복잡 유형 패키지
지지 하 다.
지지 하지 않 음
프로필 yml 이나 properties 를 설정 하면 값 을 얻 을 수 있 습 니 다.
만약 에 저 희 는 특정한 업무 논리 에서 설정 파일 의 특정한 값 을 가 져 와 야 한다 면@Value 를 사용 하 십시오.
만약 에 저희 가 javaBean 을 만들어 서 프로필 과 비 추 면@ConfigurationProperties 를 직접 사용 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기