Spring boot創(chuàng)建自定義starter的完整步驟
前言:
Springboot的出現(xiàn)極大的簡化了開發(fā)人員的配置,而這之中的一大利器便是springboot的starter,starter是springboot的核心組成部分,springboot官方同時也為開發(fā)人員封裝了各種各樣方便好用的starter模塊,例如:
- spring-boot-starter-web//spring MVC相關(guān)
- spring-boot-starter-aop //切面編程相關(guān)
- spring-boot-starter-cache //緩存相關(guān)
starter的出現(xiàn)極大的幫助開發(fā)者們從繁瑣的框架配置中解放出來,從而更專注于業(yè)務(wù)代碼,而springboot能做的不僅僅停留于此,當(dāng)面對一些特殊的情況時,我們可以使用我們自定義的springboot starter。
在創(chuàng)建我們自定義的starter之前呢,我們先看看官方是怎么說的:
- 模塊
在springboot官方文檔中,特別提到,我們需要創(chuàng)建兩個module ,其中一個是autoconfigure module 一個是 starter module ,其中 starter module 依賴 autoconfigure module
但是,網(wǎng)上仍然有很多blog在說這塊的時候其實會發(fā)現(xiàn)他們其實只用了一個module,這當(dāng)然并沒有錯,這點官方也有說明:
You may combine the auto-configuration code and the dependency management in a single module if you do not need to separate those two concerns
//如果不需要將自動配置代碼和依賴項管理分離開來,則可以將它們組合到一個模塊中。
- 命名規(guī)范
springboot 官方建議springboot官方推出的starter 以spring-boot-starter-xxx的格式來命名,第三方開發(fā)者自定義的starter則以xxxx-spring-boot-starter的規(guī)則來命名,事實上,很多開發(fā)者在自定義starter的時候往往會忽略這個東西(因為不看官方文檔很難知道這件事情。同時也不會造成其他的后果,主要是顯得不夠?qū)I(yè))。
看看官方的starter
了解了這兩點之后,那么下面讓我們一塊去探索spingboot starter的奧秘吧。
按照springboot官方給的思路,starter的核心module應(yīng)該是autoconfigure,所以我們直接去看spring-boot-autoconfigure里面的內(nèi)容。
當(dāng)Spring Boot啟動時,它會在類路徑中查找名為spring.factories的文件。該文件位于META-INF目錄中。打開spring.factories文件,文件內(nèi)容太多了,為了避免我水篇幅,我們只看其中的一部分:
# Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\ org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\ org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\ org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\ org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
我們可以發(fā)現(xiàn)一些比較眼熟的單詞,比如Aop,Rabbit,Cache ,當(dāng)springboot啟動的時候,將會嘗試加載這些配置類,如果該路徑下存在該類的話,則將運(yùn)行它,并初始化與該配置類相關(guān)的bean。
點開一個看看:
@Configuration @ConditionalOnClass({RabbitTemplate.class, Channel.class}) @EnableConfigurationProperties({RabbitProperties.class}) @Import({RabbitAnnotationDrivenConfiguration.class}) public class RabbitAutoConfiguration { //...代碼略.. }
我們先來了解一下這幾個注解:
@ConditionalOnClass :條件注解,當(dāng)classpath下發(fā)現(xiàn)該類的情況下進(jìn)行自動配置。
@EnableConfigurationProperties:外部化配置
@Import :引入其他的配置類
當(dāng)然,這并不是一種通用的套路,查看其他的配置類,我們會發(fā)現(xiàn)其標(biāo)注的注解往往也是有所區(qū)別的。
自定義自己的starter
首先我們新建一個maven項目,引入以下依賴:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> </dependencies> <dependencyManagement> <!-- 我們是基于Springboot的應(yīng)用 --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.1.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
然后我們創(chuàng)建一個person類,用作后期我們測試的bean
public class Person { //屬性 private int age; private String name; private String gender; /*此處省略getter and setter and toStering*/ }
然后我們也創(chuàng)建一個PersonConfigProperties來完成我們屬性的注入
@ConfigurationProperties(prefix = "mystarter.config.student") public class PersonConfigProperties { private String name; private int age; private String gender; /* 其他的配置信息。。。。 */ /*此處省略getter and setter and toStering*/ }
最后創(chuàng)建我們的自動配置類MyStarterAutoConfiguration.java
@Configuration @EnableConfigurationProperties(PersonConfigProperties.class) @ConditionalOnClass(Person.class) public class MyStarterAutoConfiguration { @Bean @ConditionalOnProperty(prefix = "mystarter.config", name = "enable", havingValue = "true") public Person defaultStudent(PersonConfigProperties personConfigProperties) { Person person = new Person(); person.setAge(personConfigProperties.getAge()); person.setName(personConfigProperties.getName()); person.setGender(personConfigProperties.getGender()); return person; } }
我感覺這是不是做好了?
我不要你覺得,我要我覺得
最后我們最重要的一步:
在resourecs文件目錄下創(chuàng)建META-INF,并創(chuàng)建我們自己的spring.factories,并把我們的 MyStarterAutoConfiguration添加進(jìn)去
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.jdkcb.mystarter.config.MyStarterAutoConfiguration
最后打包成jar包,在我們新的項目里面測試:
測試:
引入我們的starter,當(dāng)然也可以在本地直接引入我們的my-spring-boot-starter項目
<dependency> <groupId>com.jdkcb</groupId> <artifactId>my-spring-boot-starter</artifactId> <version>0.0.1-SNAPSHOT</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/resources/lib/my-spring-boot-starter-0.0.1-SNAPSHOT.jar</systemPath> </dependency>
在application.properties配置文件中添加我們相應(yīng)的配置
mystarter.config.enable=true mystarter.config.person.name=小明 mystarter.config.person.age=5 mystarter.config.person.gender=男
新建一個測試的Controller:
@RestController public class TestController { @Autowired private Person person; @RequestMapping("/getPerson") private Person getStudent() { return person; } }
啟動項目,在瀏覽器地址欄輸入 http://127.0.0.1:8080/getPerson ,結(jié)果如下
{"age":5,"name":"小明","gender":"男"}
大功告成~
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。
相關(guān)文章
Mybatis-Spring連接mysql 8.0配置步驟出錯的解決方法
這篇文章主要為大家詳細(xì)介紹了Mybatis-Spring連接mysql 8.0配置步驟出錯的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-06-06解決springboot responseentity<string>亂碼問題
這篇文章主要介紹了解決springboot responseentity<string>亂碼問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07詳解使用MyBatis Generator自動創(chuàng)建代碼
這篇文章主要介紹了使用MyBatis Generator自動創(chuàng)建代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12springboot mybatis druid配置多數(shù)據(jù)源教程
這篇文章主要介紹了springboot mybatis druid配置多數(shù)據(jù)源教程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11