天天看點

《SpringBoot系列七》:SprinBoot自定義自動裝配類與xxx-spring-boot-starter

一、前言

最近在搞一個SDK,在寫接入文檔時,需要讓業務子產品引入MvcInterceptor和MyBatisPlugin,是以有如下内容:

  1. 在啟動類@SpringBootApplication注解中配置掃描包路徑:io.terminus.parana.log.sdk
@SpringBootApplication(scanBasePackages = {"io.xxx.xx", "io.xxx.log.sdk"})      
  1. 或 在啟動類中通過@Import注解注入MvcInterceptor.class
@Import(MvcInterceptor.class)
@SpringBootApplication
public class XxxxApplication {
}      

正好最近在三刷《Spring Boot程式設計思想(核心篇)》,反想那麼多Spring生态元件,它們為什麼不需要添加掃描包路徑 或 通過@Import注解在啟動類導入XxxClass,由此想到可以自定義自動裝配類;

二、自定義自動裝配類

SpringBoot自動裝配的命名規則:

  • 自動裝配Class類應命名為:​

    ​XxxAutoConfiguration​

    ​;
  • 自動裝配package命名模式:​

    ​${root-package}.autoconfigure.${module-package}​

    ​,比如:
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration      

1)配置類

/**
 * 導入MvcConfig類
 */
@Configuration
@Import({InterceptorConfig.class})
public class TraceInterceptorAutoConfiguration {

    /**
     * mybatis 自定義攔截器
     */
    @Bean
    @ConditionalOnMissingClass("io.xxx.log.sdk.config.mybatis.MybatisInterceptor")
    public Interceptor getInterceptor() {
        return new MybatisInterceptor();
    }
}      

2)在resources目錄下建立META-INF/spring.factories檔案:

org.springframework.boot.autoconfigure.EnableAutoConfiguration = \
com.saint.autoconfigure.TraceInterceptorAutoConfiguration      
《SpringBoot系列七》:SprinBoot自定義自動裝配類與xxx-spring-boot-starter

到這裡自定義自動裝配類也就結束了,感覺就賊簡單。實際上關鍵點在于​

​META-INF/spring.factories​

​​檔案,SpringBoot在做自動配置時會去掃描所有的​

​META-INF/Spring.factories​

​​配置檔案。我們在​​https://mvnrepository.com/​​​上可以發現很多的​

​spring-boot-starter-xxx​

​;我們是不是可以自己搞一個呢?

《SpringBoot系列七》:SprinBoot自定義自動裝配類與xxx-spring-boot-starter

下面我就自己搞一個;

三、自定義xxx-spring-boot-starter

starter命名模式 --> ${module}-spring-boot-starter;

3)接着上面的​

​自定義自動裝配類​

​,我們在其同一工程下對其pom.xml檔案進行修改:

....
<parent>
    <artifactId>springbootstarter</artifactId>
    <groupId>com.saint</groupId>
    <version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>traceInterceptor-spring-boot-starter</artifactId>
<dependencies>

    <!-- Spring Boot Starter 基礎依賴 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <!-- 表明不傳遞spring-boot-starter依賴 -->
        <optional>true</optional>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <!-- 表明不傳遞spring-boot-starter依賴 -->
        <optional>true</optional>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <scope>test</scope>
    </dependency>

</dependencies>      

4)在其他項目(比如:auto-configure-sample)中引入starter:

<dependency>
    <groupId>com.saint</groupId>
    <artifactId>traceInterceptor-spring-boot-starter</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>