Spring Boot (三)Spring Boot的自動配置原理

你好,【程序職場】專注於:Spring Boot ,微服務 和 前端APP開發,閒暇之餘一起聊聊職場規劃,個人成長,還能帶你一起探索 副業賺錢渠道,在提升技術的同時我們一起交流 敏捷流程 提高工作效率,從技術到管理一步步提升自我!
 
標籤:一個執着的職場程序員!

本文是Spring Boot系列的第三篇,瞭解前面的文章有助於更好的理解本文:

1.Spring Boot(一)初識Spring Boot框架
2.Spring Boot(二)Spring Boot基本配置


前言

(一). Spring Boot 的自動配置

初次瞭解Spring Boot框架的小夥伴,是不是初步見識了SpringBoot使用起來很方便,今天再給小夥伴說一個神助攻,Spring Boot的自動配置,自動配置就是一個項目作爲另一個運行項目的依賴庫調用,自動使用裏面的Bean對象,可以做動態更改(個人見解),我們來研究一下 Spring Boot是怎麼實現自動配置的?

我們一下面一個案例來解釋說明SpringBoot的自動配置原理。

爲了方便理解,在這裏我們舉一個簡單的實例:

在項目中當某個類存在的時候,怎麼自動配置這個類的Bean對象的,並可以將該Bean的屬性在application.properties中配置,動態變化,OK,就這樣一個需求,我們來看看怎麼實現。

 

1,新建一個 starter的Maven項目

 

  • 創建項目,我這裏以IDEA工具爲例,創建一個Maven項目,如下如:

    點擊創建項目----》選擇Maven---》選擇maven-archetype-quickstart,然後點擊 next

 

  • 填寫GroupId和Artifactid,點擊下一步

 

 

  • 選擇Maven安裝目錄和maven資源更新目錄,然後點擊 下一步

     

 

  • 填寫項目名稱和 項目存儲目錄,點擊完成

     

 

到此,一個項目我們就創建好了。

 

2,添加依賴
 

我們在使用springboot的自動配置時,需要添加自動配置的依賴,如下:
 

<!--springboot自動配置依賴-->    <dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-autoconfigure</artifactId>      <version>2.1.9.RELEASE</version>    </dependency>

3,屬性配置

package org.cxzc.myyoung;import org.springframework.boot.context.properties.ConfigurationProperties;@ConfigurationProperties(prefix = "hello")//讀取配置文件中的hello屬性public class HelloServiceProperties {    private static final String MSG = "world";    private String msg = MSG;    public String getMsg() {        return msg;    }
    public void setMsg(String msg) {        this.msg = msg;    }}

代碼解釋:這裏是一個基本的實體類,和上一節中的類型安全的屬性獲取是一樣的,可以通過在application.properties中設置,若不設置 ,默認爲hello.msg=world

 

4,判斷依據類

package org.cxzc.myyoung;public class HelloService {    private String msg;    public String autoInfo(){        return "你好 " + msg;    }
    public String getMsg() {        return msg;    }
    public void setMsg(String msg) {        this.msg = msg;    }}

代碼解釋:我們需要根據此類是不是存在來創建這個類的Bean,這個類還可以是第三方類庫的類。

 

5,自動配置

package org.cxzc.myyoung;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;import org.springframework.boot.context.properties.EnableConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;
@Configuration@EnableConfigurationProperties(HelloServiceProperties.class)@ConditionalOnClass(HelloService.class)@ConditionalOnProperty(prefix = "hello",value = "enable",matchIfMissing = true)public class HelloServiceAutoConfiguration {    @Autowired    private HelloServiceProperties helloServiceProperties;    @Bean    public HelloService helloService() {        HelloService helloService = new HelloService();        helloService.setMsg(helloServiceProperties.getMsg());        return helloService;    }}

代碼解釋:
1,在自動配置類中使用了HelloServiceProperties提供的參數。

2,通過@ConditionalOnClass註解判斷HelloService這個類在類路徑中是否存在,切當容器中沒有這個Bean的時候自動配置這個Bean

3,@ConditionalOnProperty註解則表示指定的屬性要滿足的條件
 

6,註冊配置

如果想要上面的自動配置生效,需要註冊自動配置類,需要我們在/src/main/resources下新建META-INF/spring.factories, 目錄如下圖:

 

目錄新建好,在spring.factories文件中填寫註冊內容;若有多個西東配置需要用 “,”隔開,如果多個需要換行,需要添加“\”
 

1,不換行

org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.cxzc.myyoung.HelloServiceAutoConfiguration

 

2,換行

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\org.cxzc.myyoung.HelloServiceAutoConfiguration

 

注意:

正常情況下我們按上面步驟創建出來的項目是沒有resources這個文件夾的,在IntelliJ IDEA工具中,我們需要先創建一個目錄(directory),然後將之設置爲resources root即可,方式如下:

選中創建的resources目錄右鍵單擊-----》Mark Directory as-----》Resource Root。
如下圖:

 

到這裏我們的自動配置的所有東西都添加和配置好了,下面就是使用自動配置,如果使用我們需要新建一個 SpringBoot項目。並將上面的自動配置項目作爲依賴 引入使用。

 

一般情況下,做好自動配置類之後需要將之上傳到maven 私服上作爲一個依賴資源庫,然後直接在項目中引用,也可以將之安裝到本地庫,這裏我們條件有限制,使用最簡單的方式,直接創建Module來引用這個自動配置Module。

 

7,創建Module(SpringBoot)項目

 

創建Module流程如下:
選中剛纔的Project右鍵單擊----》New一個Module,這個Module是一個SpringBoot項目(SpringBoot項目上一張有講到,不明白的可以在瞜一眼),---》創建成功之後選擇新建的Module按(F3,F4)具體按那個鍵,根絕電腦設置,我的是F3   然後會打開Module設置,然後選擇右邊的加號添加依賴,如下圖:

 

1,進入配置項目

 

2,選擇module 

 

3,添加自動項目作爲依賴庫

 

點擊ok ,就會把自動配置作爲一個依賴庫

8,添加自動配置的依賴

創建好SpringBoot項目並且引用自動配置後,需要我們在新建Module(SpringBoot項目)的pom.xml文件中添加如下依賴:把自動配置引用進來使用。

<!--自動配置依賴-->  <dependency>      <groupId>org.cxzc.myyoung</groupId>      <artifactId>springboot_3</artifactId>      <version>1.0-SNAPSHOT</version>  </dependency>

9,SpringBoot項目的入口類中添加註入

我們在SpringBoot項目的入口類中直接注入HelloService的Bean,該類是在SpringBoot中沒有配置這個Bean的,這個是通過自動配置完成的。

package org.cxzc.my.springbootmy;import org.cxzc.myyoung.HelloService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;
@RestController@SpringBootApplicationpublic class SpringbootmyApplication {
    @Autowired    private HelloService helloService;
    @RequestMapping(value = "/",produces = "text/plain;charset=UTF-8")    public String index(){        return helloService.autoInfo();    }
    public static void main(String[] args) {        SpringApplication.run(SpringbootmyApplication.class, args);    }
}

9,SpringBoot項目的application.properties中配置msg的內容

如果需要我們可以在SpringBoot項目的application.properties中修改msg的內容,改變信息

t.uri-encoding=UTF-8spring.http.encoding.charset=UTF-8spring.http.encoding.enabled=truespring.http.encoding.force=truespring.messages.encoding=UTF-8 hello.msg = 自動化配置,修改這裏自動變化

運行SpringBoot項目,結果如下圖:
 

 

好了,自定義的自動配置 到這裏就完成了,如果小夥伴還有疑問,可以 關注我,我們一起進步

 

本案例下載地址:

https://github.com/ProceduralZC/itcxzc/tree/master/springboot_3

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章