SpringBoot 最強大的功能就是把咱們經常使用的場景抽取成了一個個starter(場景啓動器),咱們經過引入springboot 爲我提供的這些場景啓動器,咱們再進行少許的配置就能使用相應的功能。即便是這樣,springboot也不能囊括咱們全部的使用場景,每每咱們須要自定義starter,來簡化咱們對springboot的使用。java
咱們參照@WebMvcAutoConfiguration爲例,咱們看看們須要準備哪些東西,下面是WebMvcAutoConfiguration的部分代碼:git
@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時一樣須要的一些配置。github
@Configuration //指定這個類是一個配置類@ConditionalOnXXX //指定條件成立的狀況下自動配置類生效@AutoConfigureOrder //指定自動配置類的順序@Bean //向容器中添加組件@ConfigurationProperties //結合相關xxxProperties來綁定相關的配置@EnableConfigurationProperties //讓xxxProperties生效加入到容器中自動配置類要能加載須要將自動配置類,配置在META-INF/spring.factories中 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\ org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
咱們參照 spring-boot-starter 咱們發現其中沒有代碼:web
咱們在看它的pom中的依賴中有個 springboot-starter
spring
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId></dependency>
咱們再看看 spring-boot-starter 有個 spring-boot-autoconfigureapache
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId></dependency>
關於web的一些自動配置都寫在了這裏 ,因此咱們有總結:springboot
啓動器starter只是用來作依賴管理 須要專門寫一個相似spring-boot-autoconfigure的配置模塊 用的時候只須要引入啓動器starter,就可使用自動配置了
官方命名空間bash
前綴:spring-boot-starter-mybatis
模式:spring-boot-starter-模塊名app
舉例:spring-boot-starter-web、spring-boot-starter-jdbc
自定義命名空間
後綴:-spring-boot-starter
模式:模塊-spring-boot-starter
舉例:mybatis-spring-boot-starter
咱們須要先建立兩個工程 hello-spring-boot-starter 和 hello-spring-boot-starter-autoconfigurer
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.gf</groupId> <artifactId>hello-spring-boot-starter</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>hello-spring-boot-starter</name> <!-- 啓動器 --> <dependencies> <!-- 引入自動配置模塊 --> <dependency> <groupId>com.gf</groupId> <artifactId>hello-spring-boot-starter-autoconfigurer</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies></project>
同時刪除 啓動類、resources下的文件,test文件。
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.gf</groupId> <artifactId>hello-spring-boot-starter-autoconfigurer</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>hello-spring-boot-starter-autoconfigurer</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <!-- 引入spring-boot-starter,全部starter的基本配合 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> </dependencies></project>
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; }}
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(); }}
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應該生效@EnableConfigurationProperties(HelloProperties.class)public class HelloServiceAutoConfiguration { @Autowired HelloProperties helloProperties; @Bean public HelloService helloService() { HelloService service = new HelloService(); service.setHelloProperties( helloProperties ); return service; }}
在 resources 下建立文件夾 META-INF 並在 META-INF 下建立文件 spring.factories ,內容以下:
# Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.gf.service.HelloServiceAutoConfiguration
到這兒,咱們的配置自定義的starter就寫完了 ,咱們hello-spring-boot-starter-autoconfigurer、hello-spring-boot-starter 安裝成本地jar包。
咱們建立個項目 hello-spring-boot-starter-test,來測試系咱們寫的stater。
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.gf</groupId> <artifactId>hello-spring-boot-starter-test</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>hello-spring-boot-starter-test</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 引入自定義starter --> <dependency> <groupId>com.gf</groupId> <artifactId>hello-spring-boot-starter</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>
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;@RestControllerpublic class HelloController { @Autowired HelloService helloService; @GetMapping("/hello/{name}") public String hello(@PathVariable(value = "name") String name) { return helloService.sayHello( name + " , " ); }}
gf.hello.prefix = hi gf.hello.suffix = what's up man ?
我運行項目訪問 http://127.0.0.1:8080/hello/zhangsan,結果以下:
hi-zhangsan , what's up man ?
source : https://github.com/gf-huanchupk/SpringBootLearning
轉自:https://www.jianshu.com/p/b5794bbd4b54