一、簡介
成都創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括曾都網(wǎng)站建設(shè)、曾都網(wǎng)站制作、曾都網(wǎng)頁制作以及曾都網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,曾都網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到曾都省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
SpringBoot 最強(qiáng)大的功能就是把我們常用的場景抽取成了一個(gè)個(gè)starter(場景啟動(dòng)器),我們通過引入SpringBoot 為我提供的這些場景啟動(dòng)器,我們?cè)龠M(jìn)行少量的配置就能使用相應(yīng)的功能。即使是這樣,SpringBoot也不能囊括我們所有的使用場景,往往我們需要自定義starter,來簡化我們對(duì)SpringBoot的使用。
下面話不多說了,來一起看看詳細(xì)的介紹吧
二、如何自定義starter
1.實(shí)例
如何編寫自動(dòng)配置 ?
我們參照@WebMvcAutoConfiguration為例,我們看看需要準(zhǔn)備哪些東西,下面是WebMvcAutoConfiguration的部分代碼:
@Configuration @ConditionalOnWebApplication @ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurerAdapter.class}) @ConditionalOnMissingBean({WebMvcConfigurationSupport.class}) @AutoConfigureOrder(-2147483638) @AutoConfigureAfter({DispatcherServletAutoConfiguration.class, ValidationAutoConfiguration.class}) public class WebMvcAutoConfiguration { @Import({WebMvcAutoConfiguration.EnableWebMvcConfiguration.class}) @EnableConfigurationProperties({WebMvcProperties.class, ResourceProperties.class}) public static class WebMvcAutoConfigurationAdapter extends WebMvcConfigurerAdapter { @Bean @ConditionalOnBean({View.class}) @ConditionalOnMissingBean public BeanNameViewResolver beanNameViewResolver() { BeanNameViewResolver resolver = new BeanNameViewResolver(); resolver.setOrder(2147483637); return resolver; } } }
我們可以抽取到我們自定義starter時(shí),同樣需要的一些配置。
@Configuration //指定這個(gè)類是一個(gè)配置類 @ConditionalOnXXX //指定條件成立的情況下自動(dòng)配置類生效 @AutoConfigureOrder //指定自動(dòng)配置類的順序 @Bean //向容器中添加組件 @ConfigurationProperties //結(jié)合相關(guān)xxxProperties來綁定相關(guān)的配置 @EnableConfigurationProperties //讓xxxProperties生效加入到容器中 自動(dòng)配置類要能加載需要將自動(dòng)配置類,配置在META-INF/spring.factories中 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\ org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
模式
我們參照 spring-boot-starter 我們發(fā)現(xiàn)其中沒有代碼:
我們?cè)诳此膒om中的依賴中有個(gè) springboot-starter
org.springframework.boot spring-boot-starter
我們?cè)倏纯?spring-boot-starter 有個(gè) spring-boot-autoconfigure
org.springframework.boot spring-boot-autoconfigure
關(guān)于web的一些自動(dòng)配置都寫在了這里 ,所以我們有以下總結(jié):
啟動(dòng)器starter只是用來做依賴管理
需要專門寫一個(gè)類似spring-boot-autoconfigure的配置模塊
用的時(shí)候只需要引入啟動(dòng)器starter,就可以使用自動(dòng)配置了
命名規(guī)范
官方命名空間
自定義命名空間
三、自定義starter實(shí)例
我們需要先創(chuàng)建兩個(gè)工程 hello-spring-boot-starter 和 hello-spring-boot-starter-autoconfigurer
1. hello-spring-boot-starter
1.pom.xml
<?xml version="1.0" encoding="UTF-8"?>4.0.0 com.gf hello-spring-boot-starter 0.0.1-SNAPSHOT jar hello-spring-boot-starter com.gf hello-spring-boot-starter-autoconfigurer 0.0.1-SNAPSHOT
同時(shí)刪除 啟動(dòng)類、resources下的文件,test文件。
2. hello-spring-boot-starter-autoconfigurer
1. pom.xml
<?xml version="1.0" encoding="UTF-8"?>4.0.0 com.gf hello-spring-boot-starter-autoconfigurer 0.0.1-SNAPSHOT jar hello-spring-boot-starter-autoconfigurer Demo project for Spring Boot org.springframework.boot spring-boot-starter-parent 1.5.9.RELEASE UTF-8 UTF-8 1.8 org.springframework.boot spring-boot-starter
2. HelloProperties
package com.gf.service; import org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties(prefix = "gf.hello") public class HelloProperties { private String prefix; private String suffix; public String getPrefix() { return prefix; } public void setPrefix(String prefix) { this.prefix = prefix; } public String getSuffix() { return suffix; } public void setSuffix(String suffix) { this.suffix = suffix; } }
3. HelloService
package com.gf.service; public class HelloService { HelloProperties helloProperties; public HelloProperties getHelloProperties() { return helloProperties; } public void setHelloProperties(HelloProperties helloProperties) { this.helloProperties = helloProperties; } public String sayHello(String name ) { return helloProperties.getPrefix()+ "-" + name + helloProperties.getSuffix(); } }
4. HelloServiceAutoConfiguration
package com.gf.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @ConditionalOnWebApplication //web應(yīng)該生效 @EnableConfigurationProperties(HelloProperties.class) public class HelloServiceAutoConfiguration { @Autowired HelloProperties helloProperties; @Bean public HelloService helloService() { HelloService service = new HelloService(); service.setHelloProperties( helloProperties ); return service; } }
5. spring.factories
在 resources 下創(chuàng)建文件夾 META-INF 并在 META-INF 下創(chuàng)建文件 spring.factories ,內(nèi)容如下:
# Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.gf.service.HelloServiceAutoConfiguration
到這兒,我們的配置自定義的starter就寫完了 ,我們把 hello-spring-boot-starter-autoconfigurer、hello-spring-boot-starter 安裝成本地jar包。
三、測(cè)試自定義starter
我們創(chuàng)建個(gè)項(xiàng)目 hello-spring-boot-starter-test,來測(cè)試系我們寫的stater。
1. pom.xml
<?xml version="1.0" encoding="UTF-8"?>4.0.0 com.gf hello-spring-boot-starter-test 0.0.1-SNAPSHOT jar hello-spring-boot-starter-test Demo project for Spring Boot org.springframework.boot spring-boot-starter-parent 1.5.9.RELEASE UTF-8 UTF-8 1.8 org.springframework.boot spring-boot-starter-web com.gf hello-spring-boot-starter 0.0.1-SNAPSHOT org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin
2. HelloController
package com.gf.controller; import com.gf.service.HelloService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @Autowired HelloService helloService; @GetMapping("/hello/{name}") public String hello(@PathVariable(value = "name") String name) { return helloService.sayHello( name + " , " ); } }
3. application.properties
gf.hello.prefix = hi gf.hello.suffix = what's up man ?
我運(yùn)行項(xiàng)目訪問 http://127.0.0.1:8080/hello/zhangsan,結(jié)果如下:
hi-zhangsan , what's up man ?
源碼下載: https://github.com/gf-huanchupk/SpringBootLearning
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)創(chuàng)新互聯(lián)的支持。