初識(shí)Spring Boot框架之Spring Boot的自動(dòng)配置
在上篇博客初識(shí)Spring Boot框架中我們初步見(jiàn)識(shí)了SpringBoot的方便之處,很多小伙伴可能也會(huì)好奇這個(gè)spring Boot是怎么實(shí)現(xiàn)自動(dòng)配置的,那么今天我就帶小伙伴我們自己來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Spring Boot 自動(dòng)配置的案例,看看這一切到底是怎么發(fā)生的。
假設(shè)我的需求是這樣的:當(dāng)我的項(xiàng)目中存在某個(gè)類的時(shí)候,系統(tǒng)自動(dòng)為我配置該類的Bean,同時(shí),我這個(gè)Bean的屬性還可以在application.properties中進(jìn)行配置,OK,就這樣一個(gè)需求,我們來(lái)看看怎么實(shí)現(xiàn)。
1、新建starter的Maven項(xiàng)目
我這里以IntelliJ IDEA創(chuàng)建Project為例,其實(shí)很簡(jiǎn)單,創(chuàng)建一個(gè)Maven項(xiàng)目,但是注意創(chuàng)建的時(shí)候選擇quickstart,步驟如下:
OK,這樣我們就創(chuàng)建好一個(gè)Project了。
2.添加依賴
由于我們要使用Spring Boot的自動(dòng)配置功能,所以在工程創(chuàng)建成功之后首先要添加Spring Boot自身的自動(dòng)配置作為依賴,如下:
<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;
}
}
這里就是一個(gè)簡(jiǎn)單的類,和上篇博客中我們提到的 類型安全的屬性獲取是一致的,這里屬性的值我們可以在application.properties中來(lái)直接設(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;
}
}
我們一會(huì)的例子就是根據(jù)這個(gè)類是否存在來(lái)創(chuàng)建這個(gè)類的Bean,當(dāng)然這個(gè)類也可以是第三方類庫(kù)。
5.自動(dòng)配置類
@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注解主要是用來(lái)判斷HelloService這個(gè)類在路徑中是否存在,在存在且容器中沒(méi)有該類的Bean的情況下系統(tǒng)會(huì)自動(dòng)配置需要的Bean,@ConditionalOnProperty注解則表示指定的屬性要滿足的條件,在helloService方法中我們則使用了HelloServiceProperties提供的參數(shù)。
6.注冊(cè)配置
在resources目錄下新建META-INF目錄,然后在META-INF目錄下創(chuàng)建spring.factories文件,文件內(nèi)容如下,表示設(shè)置自動(dòng)配置類的位置,若有多個(gè)配置類用”,”隔開(kāi)即可。:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.sang.HelloServiceAutoConfiguration
正常情況下我們按步驟一創(chuàng)建出來(lái)的Project是沒(méi)有resources這個(gè)文件夾的,在IntelliJ IDEA這個(gè)工具中,我們需要先創(chuàng)建一個(gè)directory,然后將之設(shè)置為resources root即可,設(shè)置方式如下:選中resources目錄右鍵單擊–》Mark Directory as–》Resource Root。
7.在項(xiàng)目中使用
OK,經(jīng)過(guò)上面幾個(gè)步驟我們的自動(dòng)配置功能就算死寫好了,接下來(lái)我們要在自己的項(xiàng)目中來(lái)使用它了,正常情況下做好自動(dòng)配置類之后我們需要將之上傳到 maven 私服上然后直接在項(xiàng)目中引用,也可以將之安裝到本地庫(kù),這里我選擇后者的一個(gè)簡(jiǎn)化方式,直接創(chuàng)建Module來(lái)引用這個(gè)自動(dòng)配置Module(如果小伙伴是用STS或者M(jìn)yEclipse之類的開(kāi)發(fā)工具直接創(chuàng)建新工程然后添加引用類庫(kù)即可)。
創(chuàng)建Module方式很簡(jiǎn)單,選中剛才的Project右鍵單擊,New一個(gè)Module,這個(gè)Module是一個(gè)SpringBoot項(xiàng)目(不清楚怎么創(chuàng)建SpringBoot項(xiàng)目可以查看這篇文章初識(shí)Spring Boot框架),創(chuàng)建成功之后選擇新建的Module按F4打開(kāi)Module設(shè)置,然后選擇右邊的加號(hào)添加依賴,如下:


然后在新建Module的pom.xml文件中添加如下依賴:
<dependency>
<groupId>org.sang</groupId>
<artifactId>org.sang.mystarter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
實(shí)際上就是我們剛剛創(chuàng)建的自動(dòng)配置文件的坐標(biāo)。然后新Module的入口類中添加如下代碼:
@Autowired
private HelloService helloService;
@RequestMapping("/")
public String index(){
return helloService.sayHello();
}
使用剛剛創(chuàng)建的HelloService,如果需要我們可以在application.properties中添加如下配置:
hello.msg = 賣花擔(dān)上看桃李, 拍酒樓頭聽(tīng)管弦。
運(yùn)行Module,然后在瀏覽器中訪問(wèn),結(jié)果如下:

OK,這就是一個(gè)簡(jiǎn)單的自定義自動(dòng)配置類。
本案例下載地址:本案例GitHub地址
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java Runnable線程傳參,實(shí)現(xiàn)讓run訪問(wèn)參數(shù)
這篇文章主要介紹了Java Runnable線程傳參,實(shí)現(xiàn)讓run訪問(wèn)參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
詳解Spring Boot 使用Java代碼創(chuàng)建Bean并注冊(cè)到Spring中
本篇介紹了Spring Boot 使用Java代碼創(chuàng)建Bean并注冊(cè)到Spring中,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02
SpringBoot中FailureAnalyzer的使用詳解
這篇文章主要介紹了SpringBoot中FailureAnalyzer的使用詳解,FailureAnalyzer攔截啟動(dòng)時(shí)異常,將異常轉(zhuǎn)換成更加易讀的信息并包裝成org.springframework.boot.diagnostics.FailureAnalysis對(duì)象,監(jiān)控應(yīng)用啟動(dòng)過(guò)程,需要的朋友可以參考下2023-12-12
java?使用BeanFactory實(shí)現(xiàn)service與dao層解耦合詳解
這篇文章主要介紹了java?使用BeanFactory實(shí)現(xiàn)service與dao層解耦合詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Java多線程(單例模式,堵塞隊(duì)列,定時(shí)器)詳解
這篇文章主要介紹了java多線程的(單例模式,堵塞隊(duì)列,定時(shí)器),具有一定參考價(jià)值,加深多線程編程的理解還是很有幫助的,需要的朋友可以參考下2021-08-08

