1. 程式人生 > >SpringBoot使用(二)--配置

SpringBoot使用(二)--配置

配置是Spring Framework的核心元素,必須要有東西告訴Spring如何執行應用程式。

在嚮應用程式加入Spring Boot時,有個名為spring-boot-autoconfigure的JAR檔案,其中包含了很多配置類。每個配置類都在應用程式的Classpath裡,都有機會為應用程式的配置添磚加瓦。這些配置類裡有用於Thymeleaf的配置,有用於Spring Data JPA的配置,有用於Spiring MVC的配置,還有很多其他東西的配置,你可以自己選擇是否在Spring應用程式裡使用它們。

所有這些配置如此與眾不同,原因在於它們利用了Spring的條件化配置,這是Spring 4.0引入的新特性。條件化配置允許配置存在於應用程式中,但在滿足某些特定條件之前都忽略這個配置。

當你用Java來宣告Bean的時候,可以使用這個自定義條件類:
@Conditional(JdbcTemplateCondition.class)
public MyService myService() {
...
}

public class JdbcTemplateCondition implements Condition {
	@Override
	public boolean matches(ConditionContext context,
	AnnotatedTypeMetadata metadata) {
		try {
			context.getClassLoader().loadClass("org.springframework.jdbc.core.JdbcTemplate");
			return true;
		} catch (Exception e) {
			return false;
		}
	}
}

在這個例子裡,只有當JdbcTemplateCondition類的條件成立時才會建立MyService這個Bean。也就是說MyService Bean建立的條件是Classpath裡有JdbcTemplate。

下面列出了Spring Boot提供的條件化註解:
在這裡插入圖片描述


spring 的一些自動配置可能並不是我們想要的,所以這裡介紹一些覆蓋預設配置的方法。

第一種,顯式建立一個bean:

想要覆蓋Spring Boot的自動配置,你所要做的僅僅是編寫一個顯式的配置。
Spring Boot會發現你的配置,隨後降低自動配置的優先順序,以你的配置為準。

覆蓋預設配置的原理,當用戶配置中沒有JdbcTemplate (它實現了JdbcOperations介面)時,才會建立各個bean。

@Bean
@ConditionalOnMissingBean(JdbcOperations.class)
public JdbcTemplate jdbcTemplate() {
	return new JdbcTemplate(this.dataSource);
}

第二種,使用配置檔案的屬性:

為了微調一些細節,比如改改埠號和日誌級別,便放棄自動配置很明顯是不值得的。Spring Boot自動配置的Bean提供了300多個用於微調的屬性,當調整設定時,只要在環境變數、 Java系統屬性、 JNDI(Java Naming and Directory Interface)、命令列引數或者屬性檔案裡進行指定就好了。

Spring Boot能從多種屬性源獲得屬性,包括如下幾處:
(1) 命令列引數
(2) java:comp/env裡的JNDI屬性
(3) JVM系統屬性
(4) 作業系統環境變數
(5) 隨機生成的帶random.*字首的屬性(在設定其他屬性時,可以引用它們,比如${random.
long})
(6) 應用程式以外的application.properties或者appliaction.yml檔案
(7) 打包在應用程式內的application.properties或者appliaction.yml檔案
(8) 通過@PropertySource標註的屬性源
(9) 預設屬性
這個列表按照優先順序排序,也就是說,任何在高優先順序屬性源裡設定的屬性都會覆蓋低優先順序的相同屬性。例如,命令列引數會覆蓋其他屬性源裡的屬性。

application.properties和application.yml檔案能放在以下四個位置。

	(1) 外接,在相對於應用程式執行目錄的/config子目錄裡。
	(2) 外接,在應用程式執行的目錄裡。
	(3) 內建,在config包內。
	(4) 內建,在Classpath根目錄。

同樣,這個列表按照優先順序排序。也就是說, /config子目錄裡的application.properties會覆蓋應用程式Classpath裡的application.properties中的相同屬性。
此外,如果你在同一優先順序位置同時有application.properties和application.yml,那麼application.yml裡的屬性會覆蓋application.properties裡的屬性。


會把配置檔案中adc開頭的屬性通過set方法注入進來,set方法不可忽略。
level因為沒有adc字首,不會被注入。

server.port=8000
adc.name=juf
level=green
@ConfigurationProperties(prefix = "adc")
public class ReadingListController {

    private String name;

    private String level;

    public void setName(String name) {
        this.name = name;
    }

    public void setLevel(String level) {
        this.level = level;
    }
 }