初識Spring Boot框架之Spring Boot的自動配置
在上篇博客初識Spring Boot框架中我們初步見識了SpringBoot的方便之處,很多小伙伴可能也會好奇這個spring Boot是怎么實(shí)現(xiàn)自動配置的,那么今天我就帶小伙伴我們自己來實(shí)現(xiàn)一個簡單的Spring Boot 自動配置的案例,看看這一切到底是怎么發(fā)生的。
假設(shè)我的需求是這樣的:當(dāng)我的項(xiàng)目中存在某個類的時候,系統(tǒng)自動為我配置該類的Bean,同時,我這個Bean的屬性還可以在application.properties中進(jìn)行配置,OK,就這樣一個需求,我們來看看怎么實(shí)現(xiàn)。
1、新建starter的Maven項(xiàng)目
我這里以IntelliJ IDEA創(chuàng)建Project為例,其實(shí)很簡單,創(chuàng)建一個Maven項(xiàng)目,但是注意創(chuàng)建的時候選擇quickstart,步驟如下:
OK,這樣我們就創(chuàng)建好一個Project了。
2.添加依賴
由于我們要使用Spring Boot的自動配置功能,所以在工程創(chuàng)建成功之后首先要添加Spring Boot自身的自動配置作為依賴,如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> <version>1.4.2.RELEASE</version> </dependency>
3.屬性配置
@ConfigurationProperties(prefix = "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中來直接設(shè)置,如果不設(shè)置的話默認(rèn)為world。
4.判斷依據(jù)類
public class HelloService { private String msg; public String sayHello(){ return "hello " + msg; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }
我們一會的例子就是根據(jù)這個類是否存在來創(chuàng)建這個類的Bean,當(dāng)然這個類也可以是第三方類庫。
5.自動配置類
@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; } }
這里@ConditionalOnClass注解主要是用來判斷HelloService這個類在路徑中是否存在,在存在且容器中沒有該類的Bean的情況下系統(tǒng)會自動配置需要的Bean,@ConditionalOnProperty注解則表示指定的屬性要滿足的條件,在helloService方法中我們則使用了HelloServiceProperties提供的參數(shù)。
6.注冊配置
在resources目錄下新建META-INF目錄,然后在META-INF目錄下創(chuàng)建spring.factories文件,文件內(nèi)容如下,表示設(shè)置自動配置類的位置,若有多個配置類用”,”隔開即可。:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.sang.HelloServiceAutoConfiguration
正常情況下我們按步驟一創(chuàng)建出來的Project是沒有resources這個文件夾的,在IntelliJ IDEA這個工具中,我們需要先創(chuàng)建一個directory,然后將之設(shè)置為resources root即可,設(shè)置方式如下:選中resources目錄右鍵單擊–》Mark Directory as–》Resource Root。
7.在項(xiàng)目中使用
OK,經(jīng)過上面幾個步驟我們的自動配置功能就算死寫好了,接下來我們要在自己的項(xiàng)目中來使用它了,正常情況下做好自動配置類之后我們需要將之上傳到 maven 私服上然后直接在項(xiàng)目中引用,也可以將之安裝到本地庫,這里我選擇后者的一個簡化方式,直接創(chuàng)建Module來引用這個自動配置Module(如果小伙伴是用STS或者M(jìn)yEclipse之類的開發(fā)工具直接創(chuàng)建新工程然后添加引用類庫即可)。
創(chuàng)建Module方式很簡單,選中剛才的Project右鍵單擊,New一個Module,這個Module是一個SpringBoot項(xiàng)目(不清楚怎么創(chuàng)建SpringBoot項(xiàng)目可以查看這篇文章初識Spring Boot框架),創(chuàng)建成功之后選擇新建的Module按F4打開Module設(shè)置,然后選擇右邊的加號添加依賴,如下:
然后在新建Module的pom.xml文件中添加如下依賴:
<dependency> <groupId>org.sang</groupId> <artifactId>org.sang.mystarter</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
實(shí)際上就是我們剛剛創(chuàng)建的自動配置文件的坐標(biāo)。然后新Module的入口類中添加如下代碼:
@Autowired private HelloService helloService; @RequestMapping("/") public String index(){ return helloService.sayHello(); }
使用剛剛創(chuàng)建的HelloService,如果需要我們可以在application.properties中添加如下配置:
hello.msg = 賣花擔(dān)上看桃李, 拍酒樓頭聽管弦。
運(yùn)行Module,然后在瀏覽器中訪問,結(jié)果如下:
OK,這就是一個簡單的自定義自動配置類。
本案例下載地址:本案例GitHub地址
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java Runnable線程傳參,實(shí)現(xiàn)讓run訪問參數(shù)
這篇文章主要介紹了Java Runnable線程傳參,實(shí)現(xiàn)讓run訪問參數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09詳解Spring Boot 使用Java代碼創(chuàng)建Bean并注冊到Spring中
本篇介紹了Spring Boot 使用Java代碼創(chuàng)建Bean并注冊到Spring中,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02SpringBoot中FailureAnalyzer的使用詳解
這篇文章主要介紹了SpringBoot中FailureAnalyzer的使用詳解,FailureAnalyzer攔截啟動時異常,將異常轉(zhuǎn)換成更加易讀的信息并包裝成org.springframework.boot.diagnostics.FailureAnalysis對象,監(jiān)控應(yīng)用啟動過程,需要的朋友可以參考下2023-12-12java?使用BeanFactory實(shí)現(xiàn)service與dao層解耦合詳解
這篇文章主要介紹了java?使用BeanFactory實(shí)現(xiàn)service與dao層解耦合詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12