SpringBoot的核心就是自動配置,而支持自動配置的是一個個starter項目。除了官方已有的starter,用戶本身也能夠根據規則自定義本身的starter項目。java
自動化配置需知足如下條件:spring
這裏經過maven項目管理工具進行starter的建立。首先咱們須要建立一個簡單的maven項目。這裏咱們以集成某短信服務爲例,來建立一個項目。瀏覽器
建立一個簡單的maven項目,具體步驟省略。可經過intellj idea等IDE進行建立,也可經過maven命令進行建立。springboot
目錄結構以下:微信
. ├── pom.xml ├── spring-boot-starter-msg.iml └── src ├── main └── test
在pom.xml中引入SpringBoot自動化配置依賴spring-boot-autoconfigure:併發
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> <version>2.1.5.RELEASE</version> </dependency>
定義Service服務類,有兩個做用,一個爲引入的項目本省的功能性服務,另一個用來springboot自動配置時的判斷依據。app
這裏定義一個MsgService的類。maven
package com.secbro2.msg; import com.secbro2.utils.HttpClientUtils; public class MsgService { /** * 訪問發送短信的url地址 */ private String url; /** * 短信服務商提供的請求keyId */ private String accessKeyId; /** * 短信服務商提供的KeySecret */ private String accessKeySecret; public MsgService(String url, String accessKeyId, String accessKeySecret) { this.url = url; this.accessKeyId = accessKeyId; this.accessKeySecret = accessKeySecret; } public int sendMsg(String msg) { // 調用http服務併發送消息,返回結果 return HttpClientUtils.sendMsg(url, accessKeyId, accessKeySecret, msg); } // 省略getter/setter方法 }
其中MsgService用到了一個工具類HttpClientUtils。在HttpClientUtils中只簡單打印了請求的參數信息。ide
package com.secbro2.utils; public class HttpClientUtils { public static int sendMsg(String url, String accessKeyId, String accessKeySecret, String msg) { //TODO 調用指定url進行請求的業務邏輯 System.out.println("Http請求,url=" + url + ";accessKeyId=" + accessKeyId + ";accessKeySecret=" + accessKeySecret + ";msg=" + msg); return 0; } }
定義MsgProperties配置類,用於封裝application.properties或application.yml中的基礎配置。這裏關於短信發送的配置前綴統一採用msg。spring-boot
@ConfigurationProperties(prefix = "msg") public class MsgProperties { /** * 訪問發送短信的url地址 */ private String url; /** * 短信服務商提供的請求keyId */ private String accessKeyId; /** * 短信服務商提供的KeySecret */ private String accessKeySecret; // 其餘參數定義 // 省略getter/setter方法 }
經過@ConfigurationProperties註解來進行對應的屬性的裝配。
自動配置類就是一個普通的java類,經過不一樣的註解來對其賦予不一樣的功能。其中最核心的固然是@Configuration註解。
@Configuration @ConditionalOnClass(MsgService.class) @EnableConfigurationProperties(MsgProperties.class) public class MsgAutoConfiguration { /** * 注入屬性配置類 */ @Resource private MsgProperties msgProperties; @Bean @ConditionalOnMissingBean(MsgService.class) @ConditionalOnProperty(prefix = "msg", value = "enabled", havingValue = "true") public MsgService msgService() { MsgService msgService = new MsgService(msgProperties.getUrl(), msgProperties.getAccessKeyId(), msgProperties.getAccessKeySecret()); // 若是提供了其餘set方法,在此也能夠調用對應方法對其進行相應的設置或初始化。 return msgService; } }
MsgAutoConfiguration類上的註解,@Configuration用來聲明該類爲一個配置類;@ConditionalOnClass註解說明只有當MsgService類存在於classpath中時纔會進行相應的實例化;@EnableConfigurationProperties將application.properties中對應的屬性配置設置於MsgProperties對象中;
msgService方法上的註解,@Bean代表該方法實例化的對象會被加載到容器當中;@ConditionalOnMissingBean指明當容器中不存在MsgService的對象時再進行實例化;@ConditionalOnProperty指定了配置文件中msg.enabled=true時才進行相應的實例化。
當全部的基礎代碼和自動配置類都準備完成,就須要對其進行註冊。也就是咱們熟悉的META-INF/spring.factories配置文件了。固然,這個須要在本身的項目中進行建立。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.secbro2.msg.MsgAutoConfiguration
在spring.factories配置文件中註冊MsgAutoConfiguration類。若是有多個自動配置類,用逗號分隔換行便可。
至此,一個基於Spring Boot的自動配置starter便完成了。使用「maven:install」將其打包到本地maven倉庫或上傳至私服。其餘項目即可以經過maven依賴使用。
在其餘項目中,經過如下依賴引入該依賴。
<dependency> <groupId>com.secbro2</groupId> <artifactId>spring-boot-starter-msg</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
而後在當前項目的application.properties中配置對應的參數:
msg.enabled=true msg.url=127.0.0.1 msg.accessKeyId=10001 msg.accessKeySecret=afelwjfwfwef
好比其餘項目一樣是Spring Boot項目,則可定義一個簡單的Controller來進行測試。
@RestController public class HelloWorldController { @Resource private MsgService msgService; @RequestMapping("/sendMsg") public String sendMsg(){ msgService.sendMsg("測試消息"); return ""; } }
當經過瀏覽器訪問:http://localhost:8080/sendMsg時,便會打印出以下日誌:
Http請求,url=127.0.0.1;accessKeyId=10001;accessKeySecret=afelwjfwfwef;msg=測試消息
說明MsgService對象被自動配置,而且測試經過。
而針對短信發送這樣的starter,能夠進行進一步拓展,實現短信發送的各類基礎功能,而當其餘項目須要時只用引入對應的依賴,並配置具體的參數便可立刻使用,是否是很是方便?
總結下Starter的工做流程:
<center>程序新視界:精彩和成長都不容錯過</center>