微服務開發的入門級框架Spring Boot詳解(二)

一、Spring Boot的屬性配置文件

        1.1 Spring Boot的屬性配置文件的第一種形式

            使用properties配置文件,以下兩個屬性的含義是更改訪問端口爲8081,而且加了一個contextPath,能夠理解爲在地址欄多加層地址。html

server.port=8081
server.context-path=/joyou

                右鍵點擊DemoApplication.java ——》Run As ——》Spring Boot App啓動程序java

            效果以下,首先從日誌上看,端口已經變爲8081web

            瀏覽器訪問效果以下。spring

   

            補充:瀏覽器

            屬性文件是最多見的管理配置屬性的方式。Spring Boot 提供的 SpringApplication 類會搜索並加載 application.properties 文件來獲取配置屬性值。SpringApplication 類會在下面位置搜索該文件:app

1.當前目錄的/config子目錄 dom

2.當前目錄 spring-boot

3.classpath 中的/config包 測試

4.classpathspa

上面的順序也表示了該位置上包含的屬性文件的優先級。優先級按照從高到低的順序排列。

能夠經過spring.config.name這個key的配置屬性來指定不一樣的屬性文件名稱。也能夠經過spring.config.location來添加額外的屬性文件的搜索路徑

         1.2 Spring Boot的屬性配置文件的第二種形式(推薦)

                    使用yml方式配置,在resources目錄下創建application.yml文件。代碼以下。

server:
  port: 8082
  context-path: /joyou

                效果與1.1相同。

                  補充:                   

                相對於屬性文件來講,YAML 是一個更好的配置文件格式。當有前綴的狀況下,使用.yml格式的配置文件更簡單。

注意:使用.yml時,屬性名的值和冒號中間必須有空格,如name: SpringBoot正確,SpringBoot就是錯的。

YAML 在 Ruby on Rails 中獲得了很好的應用。YAML是JSON的一個超集,也是一種方便的定義層次配置數據的格式。它的基本語法規則以下:

  • 大小寫敏感
  • 使用縮進表示層級關係
  • 縮進時不容許使用Tab鍵,只容許使用空格。
  • 縮進的空格數目不重要,只要相同層級的元素左側對齊便可
  • # 表示註釋,從這個字符一直到行尾,都會被解析器忽略。

         1.3 application.properties裏面到底有哪些key是可配置的?

        在SpringBoot官網文檔給出了詳盡的配置以及說明。在Appendix A. Common application properties中:http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#common-application-properties

            不徹底統計,這個完整的application properties文件,有1183行。其中,屬性key有950個。當你看到如此龐大的配置,你必定會被嚇到。不過,在實際項目中,咱們若是遵循Spring Boot的約定,一般不須要咱們單獨指定太多配置。

            1.4 關於配置的優先級

            Spring Boot提供了一種優先級配置讀取的機制來幫助咱們從這種困境中走出來。

            Spring Boot 所提供的配置優先級順序比較複雜。按照優先級從高到低的順序,具體的列表(從高到低)以下所示。

  •             1.命令行參數(優先級最高)。
  •             2.經過 System.getProperties() 獲取的 Java 系統參數。
  •             3.操做系統環境變量。
  •             4.從 java:comp/env 獲得的 JNDI 屬性。
  •             5.經過 RandomValuePropertySource 生成的random.*屬性。
  •             6.jar包外部的application-{profile}.properties或application.yml(帶spring.profile)配置文件,經過spring.config.location參數指定
  •             7.jar包內部的application-{profile}.properties或application.yml(帶spring.profile)配置文件
  •             8.jar包外部的application.properties或application.yml(不帶spring.profile)配置文件
  •             9.jar包內部的application.properties或application.yml(不帶spring.profile)配置文件
  •             10.應用 Java配置類,包含@Configuration註解的 Java 類,經過@PropertySource註解聲明的屬性文件。
  •             11.經過SpringApplication.setDefaultProperties聲明的默認屬性。

            若是Spring Boot在優先級更高的位置找到了配置,那麼它就會忽略優先級低的配置。下面咱們簡單講講這些優先級。Spring Boot 的這個配置優先級看似複雜,實際上是很合理的。命令行參數的優先級之因此被設置爲最高,是由於能夠方便咱們在測試或生產環境中快速地修改配置參數值,而不須要從新打包和部署應用。

            SpringApplication 類默認會把以「--」開頭的命令行參數轉化成應用中可使用的配置參數,如 「--name=Alex」 會設置配置參數 「name」 的值爲 「Alex」。

            若是不須要這個功能,能夠經過SpringApplication.setAddCommandLineProperties(false)

禁用解析命令行參數。

二、Spring Boot自定義屬性

                2.一、 第一個自定義屬性的例子  

                          在實際開發過程當中,須要程序去配置文件中讀取數據(如:URL,一些帳號密碼等),因此就須要咱們來自定義屬性,供程序讀取。

                        首先在yml裏自定一個屬性,格式以下:

company: joyou
employee: 二十歲之後

                        在Java程序中取值,代碼以下:

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloSpringBoot {
	
	@Value("${company}")
	private String company;
	
	@Value("${employee}")
	private String employee;
	

	@RequestMapping(value="/hello" , method = RequestMethod.GET)
	public String HelloSpring(){
		
			return company+"====="+employee;
	}
}

                使用瀏覽器訪問效果以下

                2.2 在自定義屬性中調用其餘屬性

                        yml文件中的配置               

company: joyou
employee: 二十歲之後
   
All: "公司: ${company} , 員工: ${employee}"

                    在JAVA程序中注入All屬性

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloSpringBoot {
	
	@Value("${All}")
	private String All;
	
	
	@RequestMapping(value="/hello" , method = RequestMethod.GET)
	public String HelloSpring(){
		
			return All;
	}
}

            效果如圖所示:

            2.3 對於多個屬性如何一次調用

                    看了上面的例子後,會產生一個疑問,若是想一次調用10個、20個、50個屬性值,難道我要在程序中注入50次值,使用50次註解嗎? 爲了解決這個疑問,Spring Boot 是這麼解決的!

                    首先一個女孩,有身高、體重、罩杯等等屬性,咱們能夠這樣來寫!

Girl: 
   High: 160CM
   Weight: 80KG
   CupSize: 30A

                    而後寫一個類,這個類中提供Girl的屬性,及Setter,Geter方法,須要使用兩個註解:

  •                     @Component //若是沒有這個註解,會報找不到Bean的錯
  •                     @ConfigurationProperties(prefix="Girl") //找到以Girl開頭的屬性

 

                    而後在java程序中注入Gril類

package com.example.demo;

@RestController
public class HelloSpringBoot {

	@Autowired
	private Girl girl;
	
	
	@RequestMapping(value="/hello" , method = RequestMethod.GET)
	public String HelloSpring(){
		
			return girl.toString();
	}
}

                啓動程序,刷新瀏覽器,效果以下:

三、多環境的屬性配置

            3.1 生產與開發的不一樣場景

                    面對生產與開發的不一樣場景,對於一些屬性的值可能不一樣,難道我要在開發環境寫的屬性值,到生產環境在一個一個改嗎?既然都這麼說了,那固然是不用的了。咱們能夠在開發時候就寫好兩套環境中對於屬性值不一樣需求的yml文件,而後在調用須要的yml文件就行了。

                對於生產環境Girl的屬性值以下:

                對於開發環境Girl的屬性值以下:

                我只須要在application.yml中調用不一樣的文件就行了,dev這個值是我開發和生產環境不一樣yml文件的後綴名(注意看上面兩個圖文件的命名

    瀏覽器對應的結果

            第二種環境對應的配置

        瀏覽器對應的結果

補一張到目前爲止的項目目錄結構,幫助理解

相關文章
相關標籤/搜索