一、前言
最近在搞一个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>
OK,这样其他项目就可以使用到traceInterceptor-spring-boot-starter
中自动装配的类了。
注意:在自定义的starter 的pom中,将spring-boot-starter
的maven依赖声明为<optional>true</optional>
,表明formatter-spring-boot-starter
(自定义starter)不应该传递spring-boot-starter
依赖;否则会将spring-boot-starter
版本固定,导致引用自定义starter的应用出现版本冲突问题。