1. 程式人生 > >SpringBoot(二) 主程式詳解和配置檔案如何配置

SpringBoot(二) 主程式詳解和配置檔案如何配置

SpringBoot主程式詳解

 1 /**
 2  *  @SpringBootApplication 來標註一個主程式類,說明這是一個Spring Boot應用
 3  */
 4 @SpringBootApplication
 5 public class HelloWorldMainApplication {
 6 
 7     public static void main(String[] args) {
 8 
 9         // Spring應用啟動起來
10         SpringApplication.run(HelloWorldMainApplication.class
,args); 11 } 12 }

上段程式是一個SpringBoot主程式,入口方法。

@SpringBootApplication:Spring Boot應用標註在某個類上說明這個類是SpringBoot的主配置類,SpringBoot就應該執行這個類的main方法來啟動SpringBoot應用;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters 
= { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) public @interface SpringBootApplication {}

@SpringBootConfiguration:Spring Boot的配置類,標註在某個類上,表示這是一個Spring Boot的配置類。

@EnableAutoConfiguration

:開啟自動配置功能。

​@EnableAutoConfigurationImportSelector:匯入哪些元件的選擇器。將所有需要匯入的元件以全類名的方式返回;這些元件就會被新增到容器中。有了自動配置類,免去了我們手動編寫配置注入功能元件等的工作。

​ SpringBoot 配置

 Spring Boot使用了一個全域性的配置檔案application.properties,放在src/main/resources目錄下或者類路徑的/config下。

 Sping Boot的全域性配置檔案的作用:修改SpringBoot自動配置的預設值。SpringBoot在底層都會給我們自動配置好。

 名稱是固定的:application.properties  或者 application.yml

    yml是YAML(YAML Ain’t Markup Language)語言。它是以資料為中心的語言,它比json、xml更適合做配置檔案。

配置例項:

<!--  xml形式配置  -->
<server>
  <port>8081</port>
</server>

<!-- properties形式配置  -->
server.port=8081


<!--  yml形式配置  -->
server:
  port: 8081

 YML語法   自定義屬性

1.基本語法

  書寫形式 k:  v    ==>    表示一對鍵值對(冒號和v之間的空格必須有);

    以空格的縮排來控制層級關係;只要是左對齊的一列資料,都是同一個層級的。

    屬性值的英文大小寫敏感。

server:
    port: 8081
    path: /hello

2.字面量

普通的值(數字,字串,布林):   k: v  ==> v 直接編寫數字,字串,布林等值。如果是字串新增雙引號,則不會進行轉義。使用單引號會進行轉義。

物件: k : v

friends:
    lastName: zhangsan
    age: 20
//也可以和ajax一樣編寫
friends: {lastName: zhangsan,age: 18}

陣列(list、set等):

pets:
 - cat
 - dog
 - pig

//或者

pets: [cat,dog,pig]

3.使用配置檔案中的值

 1 //配置檔案
 2 person:
 3     lastName: hello
 4     age: 18
 5     boss: false
 6     maps: {k1: 11,k2: 12}
 7     list:
 8       - lisi
 9       - wangwu
10     dog:
11       name: 小狗
12       age: 12
13 
14 
15 
16 /**
17  * 將配置檔案中配置的每一個屬性的值,對映到這個元件中
18  * @ConfigurationProperties:告訴SpringBoot將本類中的所有屬性和配置檔案中相關的配置進行繫結.
19  *      prefix = "person":配置檔案中哪個下面的所有屬性進行一一對映
20  *
21  * 只有這個元件是容器中的元件,才能容器提供的@ConfigurationProperties功能;
22  *
23  */
24 @Component
25 @ConfigurationProperties(prefix = "person")
26 public class Person {
27 
28     private String lastName;
29     private Integer age;
30     private Boolean boss;
31     private List<Object> list;
32     private Dog dog;
33 }
34 
35 
36 //pom.xml檔案新增屬性
37 <!--匯入配置檔案處理器,配置檔案進行繫結就會有提示-->
38     <dependency>
39       <groupId>org.springframework.boot</groupId>
40       <artifactId>spring-boot-configuration-processor</artifactId>
41       <optional>true</optional>
42     </dependency>

 還需要在spring Boot入口類加上@EnableConfigurationProperties並指明要載入哪個bean,如果不寫ConfigBean.class,在建好的類那邊新增。最後在Controller中引入ConfigBean使用即可。注意使用自動注入的註解。

在1.5的版本之後,需要新增@Configuration和@PropertySource(“classpath:xxxxxx.properties”)後才可以讀取。

 1 /**
 2  * 將配置檔案中配置的每一個屬性的值,對映到這個元件中
 3  * @ConfigurationProperties:告訴SpringBoot將本類中的所有屬性和配置檔案中相關的配置進行繫結;
 4  *      prefix = "person":配置檔案中哪個下面的所有屬性進行一一對映
 5  *
 6  * 只有這個元件是容器中的元件,才能容器提供的@ConfigurationProperties功能;
 7  *  @ConfigurationProperties(prefix = "person")預設從全域性配置檔案中獲取值;
 8  *
 9  */
10 @PropertySource(value = {"classpath:person.properties"})
11 @Component
12 @ConfigurationProperties(prefix = "person")
13 //@Validated
14 public class Person {}

4.使用配置檔案生成隨機數

在配置檔案中${random} 可以用來生成各種不同型別的隨機值,例如 生成 int 值、long 值或者 string 字串。

secret=${random.value}
number=${random.int}
longnumber=${random.long}
uuid=${random.uuid}

 @Value和@Validated

@ConfigurationProperties@Value
功能 批量注入配置檔案中的屬性 一個個指定
鬆散繫結(鬆散語法) 支援 不支援
SpEL 不支援 支援
JSR303資料校驗 支援 不支援
複雜型別封裝 支援 不支援

配置檔案yml還是properties他們都能獲取到值。

書寫形式: @Value("${配置檔案中的key}")。注意key要全稱。

例如:@Value("${person.age}"),@Value("${person.dog.name}")

   計算: @Value("#{12*2}")  ==>  對應的值就是24

資料校驗:@Valiadated註解自動校驗。

 1 @Component
 2 @ConfigurationProperties(prefix = "person")
 3 @Validated
 4 public class Person {
 5    //lastName必須是郵箱格式
 6     @Email
 7     private String lastName;
 8     //@Value("#{11*2}")
 9     private Integer age;
10     //@Value("true")
11     private Boolean boss;
12 
13     private Date birth;
14     private Map<String,Object> maps;
15     private List<Object> lists;
16     private Dog dog;
17 }

配置檔案讀取優先順序

application.properties和application.yml檔案可以放在一下四個位置:

  • 外接,在相對於應用程式執行目錄的/congfig子目錄裡。
  • 外接,在應用程式執行的目錄裡
  • 內建,在config包內
  • 內建,在Classpath根目錄

按照優先順序排序,src/main/resources/config下application.properties覆蓋src/main/resources下application.properties中相同的屬性

另外,如果在相同優先順序位置同時有application.properties和application.yml,那麼application.yml裡面的屬性就會覆蓋application.properties裡的屬性。

Profile多環境配置

當應用程式需要部署到不同執行環境時,一些配置細節通常會有所不同,尤其是開發過程中的開發環境和生產環境的配置檔案。
如果按照以前的做法,就是每次釋出的時候替換掉配置檔案,這樣太麻煩了,Spring Boot的Profile就給我們提供瞭解決方案,命令帶上引數就搞定。

在Spring Boot中多環境配置檔名需要滿足application-{profile}.properties的格式,其中{profile}對應你的環境標識,比如:

application-test.properties:開發環境
application-prod.properties:生產環境

想要使用對應的環境,只需要在application.properties中使用spring.profiles.active屬性來設定,值對應上面提到的{profile},也就是上述程式碼的test、prod這2個。

server:
  port: 8081
spring:
  profiles:
    active: prod

---
server:
  port: 8083
spring:
  profiles: test


---

server:
  port: 8084
spring:
  profiles: prod  #指定屬於哪個環境