1. 程式人生 > >三十二、Springboot 配置

三十二、Springboot 配置

(一)配置的作用   Spring Boot 應用的外部配置資源,這些配置資源能夠與程式碼相互配合,避免硬編碼 方式,提供應用資料或行為變化的靈活性。

(二)型別

  • Properties 檔案
  • YAML 檔案
  • 環境變數
  • Java 系統屬性
  • 命令列

(三)載入順序

  • 熱載入
  • 測試
  • 命令列
  • Servlet 引數(ServletConfig、ServletContext)
  • JNDI
  • 先系統屬性,再環境變數
  • application-{profile}.properties(先外後內)
  • application.properties(先外後內)
  • @PropertySource
  • SpringApplication.setDefaultProperties

(三)配置引用

  • XML 檔案
  • Annotation
  • Java Code

  案例背景:   建立 application.properties :

person.id = 2
person.age = 19

book.isbn = 1234567
book.name = 我愛我家

  建立 POJO:

public class Person {
    private Long id;
    private String name;
    private Integer age;
}

1、 XML 檔案

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="person" class="org.pc.domain.Person">
        <property name="id" value="${person.id}"/>
        <property name="name" value="張三"/>
        <property name="age" value="${person.age}"/>
    </bean>
</beans>

2、Annotation 方式一:單項讀取

@RestController
public class PersonController {
    @Autowired
    private Person person;

    /**
     * 註解方式獲取配置項
     */
    @Value("${person.id}")
    private Long id;

    /**
     * “:李四”:代表name屬性的預設值,當沒有配置 person.name 時呼叫
     */
    @Value("${person.name:李四}")
    private String name;

    private Integer age;


    @GetMapping("/person")
    public Person getPerson(){
        return person;
    }

    @GetMapping("/person/data")
    public Map<String, Object> getDatas(){
        Map<String, Object> map = new LinkedHashMap<>();

        map.put("id", id);
        map.put("name", name);
        map.put("age", age);

        return map;
    }
}

方式二:POJO類與配置項繫結 配置項:

book.isbn = 1234567
book.name = 我愛我家

POJO類:

/**
 * POJO類繫結配置檔案中的配置項:
 * 註解:@ConfigurationProperties("book")
 * 功能:自動裝載application.properties中以“book”開頭的配置項,根據屬性名
 *       自動裝配到相應的 field 欄位。比如:
 *       application.properties中:book.isbn = 1234567  book.name = 我愛我家
 *       那麼book.isbn會自動裝載到 isbn ;book.name 會自動裝載到 name
 *
 * 在使用該物件的類中,需要加 @EnableConfigurationProperties(Book.class) 啟用該功能
 */
@ConfigurationProperties("book")
public class Book {
    private String isbn;
    private String name;
}

應用 @EnableConfigurationProperties(Book.class):

@RestController
@EnableConfigurationProperties(Book.class)
public class BookController {
    @Autowired
    private Book book;

    @GetMapping("/book")
    public Book getBook(){
        return book;
    }
}

3、 Java Code 編碼方式   核心是實現 EnvironmentAware 介面,過載 setEnvironment() 方法,案例如下:

@RestController
public class PersonController implements EnvironmentAware {
    @Autowired
    private Person person;

    /**
     * 註解方式獲取配置項
     */
    @Value("${person.id}")
    private Long id;

    /**
     * “:李四”:代表name屬性的預設值,當沒有配置 person.name 時呼叫
     */
    @Value("${person.name:李四}")
    private String name;

    private Integer age;


    @GetMapping("/person/data")
    public Map<String, Object> getDatas(){
        Map<String, Object> map = new LinkedHashMap<>();

        map.put("id", id);
        map.put("name", name);
        map.put("age", age);

        return map;
    }

    /**
     * 編碼方式獲取配置檔案 配置項:
     * 實現 EnvironmentAware 介面,過載該方法
     */
    @Override
    public void setEnvironment(Environment environment) {
        this.age = environment.getProperty("person.age", Integer.class);
    }
}