1. 程式人生 > >34 自定義starter

34 自定義starter

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");
    }
}

3.3.4 測試結果

測試結果