SpringBoot如何實現(xiàn)starter原理詳解
1、Mybatis 自定義配置的分析
在我們自定義starter之前我們寫了解一下Mybatis 是如何實現(xiàn)starter
在SpringBoot 引入的依賴如下:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
mybatis的maven 依賴,主要涉及到的內容,spring.factories、MybatisAutoConfiguration、MybatisProperties

我們來看一下 META-INF/spring.factories文件,這個文件是以Map 形式存放的。key是EnableAutoConfiguration類的全類名,
value是一個MybatisAutoConfiguration,這就是當項目啟動自動配置的類。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration
MybatisAutoConfiguration

@Configuration //標示是一個配置類
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class}) //表示當SqlSessionFactory,SqlSessionFactoryBean存在這個配置類才生效。
@EnableConfigurationProperties({MybatisProperties.class}):就是把 MybatisProperties加入到 IOC 容器中。
MybatisProperties

對于@ConfigurationProperties注解它的作用就是把全局配置文件中的值綁定到實體類JavaBean上面(將配置文件中的值與MybatisProperties綁定起來),而@EnableConfigurationProperties主要是把以綁定值JavaBean加入到spring容器中。
分析完這些規(guī)則后,我們再來看看mybatis自定義的starter 的項目結構,主要是分為兩個項目(一個是空項目(mtbatis-spring-boot-starter),一個是具體的實現(xiàn)自定義配置的項目(mybatis-spring-boot-autoconfigure)),空項目只是引入自定義配置項目的依賴,而實現(xiàn)映入的時候我們只需要映入空項(mtbatis-spring-boot-starter)即可。
到此我們已經(jīng)分析完mybatis 自定義的starter,下面我們自己來實現(xiàn)一個自定義的starter。
2、自定義starter的實現(xiàn)
項目結構展示:

首先我們先定義一個 zfauto-spring-boot-autoconfigure 工程
編寫屬性類:添加 @ConfigurationProperties注解和前綴 zf.auto。之后我們就可以在 application.properties或application.yml 中 使用 zf.auto=指定參數(shù)了,由于篇幅的原因省略setter getter方法,實際是需要的,不然無法注入;
@ConfigurationProperties(prefix = "zf.auto")
public class HelloProperties {
private String prefix;
private String suffix;
}
編寫配置類:加入@Configuration注解,@ConditionalOnWebApplication是web 應用配置類才起作用,以及 @EnableConfigurationProperties(HelloProperties.class) 注解,將屬性注入到 IOC 容器中。
@Configuration
@ConditionalOnWebApplication
@EnableConfigurationProperties(HelloProperties.class)
public class HelloServiceAutoConfiguration {
@Autowired
HelloProperties helloProperties;
@Bean
public HelloService helloService(){
HelloService helloService=new HelloService();
helloService.setHelloProperties(helloProperties);
return helloService;
}
}
編寫 spring.factories 文件:在resources路徑下面創(chuàng)建META-INF,文件夾,然后創(chuàng)建spring.factories文件
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.zfauto.starter.HelloServiceAutoConfiguration
然后我們在創(chuàng)建一個空項目(zfauto-spring-boot-starter),在這個項目中我們引入zfauto-spring-boot-autoconfigure依賴
<dependency>
<groupId>com.zfauto.starter</groupId>
<artifactId>zfauto-spring-boot-autoconfigure</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
HelloService 實現(xiàn)的功能,省略setter,getter的方法(實際需要)
public class HelloService {
HelloProperties helloProperties;
public String sayHello(String name){
return helloProperties.getPrefix()+ ","+name+","+helloProperties.getSuffix();
}
}
最后我們 分別將項目打包,由于zfauto-spring-boot-starter是依賴于zfauto-spring-boot-autoconfigure,所以我們先對zfauto-spring-boot-autoconfigure進行打包,然后通過 mvn install 打到本地倉庫(如何打包見下圖)。

到此我們自定義的類實現(xiàn)。那我們來測試一下,這個和我們引入其他的starter一樣了。
創(chuàng)建項目zfauto-spring-boot-starter-test ,引入自定義starter的依賴。
<dependency>
<groupId>com.zfauto.starter</groupId>
<artifactId>zfauto-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
application.properties中的配置如下
zf.auto.prefix=hello
zf.auto.suffix=123
具體的測試類
@RestController
public class HelloController {
@Autowired
HelloService helloService;
@RequestMapping("/sayHello")
public String sayHello(){
return helloService.sayHello("小福子");
}
}
項目訪問路徑:http://localhost:8080/sayHello

好了 ,本文就說到這里,本文相關案例我已經(jīng)上傳到 碼云 ,小伙伴們可以自行下載:https://gitee.com/xiaofuzi123/springboot-learning-example
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
詳解SpringBoot實現(xiàn)事件同步與異步監(jiān)聽
這篇文章主要通過示例為大家詳細介紹了SpringBoot中的事件的用法和原理以及如何實現(xiàn)事件同步與異步監(jiān)聽,快跟隨小編一起學習學習吧2022-06-06
IntelliJ Idea常用11款插件(提高開發(fā)效率)
這篇文章主要介紹了IntelliJ Idea常用11款插件(提高開發(fā)效率),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07
為什么rest接口返回json建議采用下劃線形式,不要用駝峰
為什么rest接口返回json建議采用下劃線形式,不要用駝峰?今天小編就來為大家說明一下原因,還等什么?一起跟隨小編過來看看吧2020-09-09
SpringBoot實現(xiàn)簡易支付寶網(wǎng)頁支付功能
小編最近實現(xiàn)一個功能基于springboot程序的支付寶支付demo,非常不錯適合初學者入門學習使用,今天把SpringBoot實現(xiàn)簡易支付寶網(wǎng)頁支付功能的示例代碼分享給大家,感興趣的朋友參考下吧2021-10-10

