你好,【程序職場】專注於: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
@SpringBootApplication
public 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-8
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
spring.messages.encoding=UTF-8
hello.msg = 自動化配置,修改這裏自動變化
運行SpringBoot項目,結果如下圖:
好了,自定義的自動配置 到這裏就完成了,如果小夥伴還有疑問,可以 關注我,我們一起進步
本案例下載地址:
https://github.com/ProceduralZC/itcxzc/tree/master/springboot_3