三十二、Springboot 配置
阿新 • • 發佈:2018-12-17
(一)配置的作用 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);
}
}