一、前言
最近在搞一個SDK,在寫接入文檔時,需要讓業務子產品引入MvcInterceptor和MyBatisPlugin,是以有如下内容:
- 在啟動類@SpringBootApplication注解中配置掃描包路徑:io.terminus.parana.log.sdk
@SpringBootApplication(scanBasePackages = {"io.xxx.xx", "io.xxx.log.sdk"})
- 或 在啟動類中通過@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
到這裡自定義自動裝配類也就結束了,感覺就賊簡單。實際上關鍵點在于
META-INF/spring.factories
檔案,SpringBoot在做自動配置時會去掃描所有的
META-INF/Spring.factories
配置檔案。我們在https://mvnrepository.com/上可以發現很多的
spring-boot-starter-xxx
;我們是不是可以自己搞一個呢?
下面我就自己搞一個;
三、自定義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>