《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

在这里插入图片描述
到这里自定义自动装配类也就结束了,感觉就贼简单。实际上关键点在于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的应用出现版本冲突问题。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秃秃爱健身

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值