34 自定義starter
阿新 • • 發佈:2018-12-29
1 WebMvcAutoConfiguration
// @Configuration : 指定這個類是一個配置類
@Configuration
//@ConditionalOn*: 在指定條件成立的情況下自動配置類生效
@ConditionalOnWebApplication(
type = Type.SERVLET
)
@ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
@ConditionalOnMissingBean({WebMvcConfigurationSupport. class})
@AutoConfigureOrder(-2147483638)
//@AutoConfigureAfter : 指定自動配置類的順序
@AutoConfigureAfter({DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class})
public class WebMvcAutoConfiguration {
// @Bean : 給容器中新增元件
@Bean
@ConditionalOnMissingBean ({HiddenHttpMethodFilter.class})
// @ConfigurationPropertie : 結合相關xxxProperties類來繫結相關的配置
@ConditionalOnProperty(
prefix = "spring.mvc.hiddenmethod.filter",
name = {"enabled"},
matchIfMissing = true
)
public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {
return new OrderedHiddenHttpMethodFilter();
}
@Configuration
@Import({WebMvcAutoConfiguration.EnableWebMvcConfiguration.class})
// @EnableConfigurationProperties : 讓xxxProperties生效
@EnableConfigurationProperties({WebMvcProperties.class, ResourceProperties.class})
@Order(0)
public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer, ResourceLoaderAware {
......
}
......
}
2 如何使自動進攻配置類生效
- 將需要啟動就載入的自動配置類,配置在META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
3 樣例
3.1 新建專案
3.1.1 新建Maven空專案(springboot-29-starter)
3.1.2 新增自動配置模組(gp6-springboot-starter-autoconfig)
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.gp6.starter</groupId>
<artifactId>gp6-springboot-starter-autoconfig</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>gp6-springboot-starter-autoconfig</name>
<description>Demo project for Spring Boot</description>
<properties>
<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>
3.1.3 新增啟動器模組(gp6-springboot-starter)
<?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.gp6.starter</groupId>
<artifactId>gp6-springboot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
<!--將自動配置引入-->
<dependencies>
<dependency>
<groupId>com.gp6.starter</groupId>
<artifactId>gp6-springboot-starter-autoconfig</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
3.2 自定義starter
3.2.1 自定義Properties
package com.gp6.starter.autoconfig.properties;
import org.springframework.boot.context.properties.ConfigurationProperties;
// 讀取所有gp6.spring配置
@ConfigurationProperties(prefix = "gp6.spring")
public class MyProperties {
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.2.2 MyService
package com.gp6.starter.autoconfig.service;
import com.gp6.starter.autoconfig.properties.MyProperties;
public class MyService {
MyProperties myProperties;
public MyProperties getHelloProperties() {
return myProperties;
}
public void setMyProperties(MyProperties myProperties) {
this.myProperties = myProperties;
}
public String sayHello(String name) {
return myProperties.getPrefix() + "-" + name + myProperties.getSuffix();
}
}
3.2.3 自定義自動配置
package com.gp6.starter.autoconfig;
import com.gp6.starter.autoconfig.properties.MyProperties;
import com.gp6.starter.autoconfig.service.MyService;
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
// web應用生效
@ConditionalOnWebApplication
@EnableConfigurationProperties(MyProperties.class)
public class MyServiceAutoConfiguration {
@Autowired
MyProperties myProperties;
// 向容器中新增myService元件
@Bean
public MyService myService() {
MyService service = new MyService();
service.setMyProperties(myProperties);
return service;
}
}
3.2.4 spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.gp6.starter.autoconfig.MyServiceAutoConfiguration
3.3 測試
3.3.1 新建測試專案
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--引入自定義的starter-->
<dependency>
<groupId>com.gp6.starter</groupId>
<artifactId>gp6-springboot-starter-autoconfig</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>
3.3.2 新增配置
gp6.spring.prefix=你好了嗎?
gp6.spring.suffix=我好了
3.3.3 MyController
package com.gp6.springboot28.controller;
import com.gp6.starter.autoconfig.service.MyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@Autowired
MyService myService;
@GetMapping("/test")
public String test(){
return myService.sayHello("gp6");
}
}