《SpringBoot系列七》:SprinBoot自定义自动装配类与xxx-spring-boot-starter

简介: 《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月前
|
监控 Java 应用服务中间件
Spring和Spring Boot的区别
Spring和Spring Boot的主要区别,包括项目配置、开发模式、项目依赖、内嵌服务器和监控管理等方面,强调Spring Boot基于Spring框架,通过约定优于配置、自动配置和快速启动器等特性,简化了Spring应用的开发和部署过程。
51 19
|
1月前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
56 2
|
1月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
90 1
|
1月前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
26 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
|
1月前
|
Java API Spring
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中过滤器的基础知识和实战项目应用的教程。
23 0
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
|
1月前
|
Java 测试技术 Spring
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件
这篇文章介绍了Spring Boot中配置文件的语法、如何读取配置文件以及如何通过静态工具类读取配置文件。
46 0
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件
|
1月前
|
Java API Spring
springBoot:注解&封装类&异常类&登录实现类 (八)
本文介绍了Spring Boot项目中的一些关键代码片段,包括使用`@PathVariable`绑定路径参数、创建封装类Result和异常处理类GlobalException、定义常量接口Constants、自定义异常ServiceException以及实现用户登录功能。通过这些代码,展示了如何构建RESTful API,处理请求参数,统一返回结果格式,以及全局异常处理等核心功能。
|
1月前
|
JSON 缓存 前端开发
SpringBoot的 ResponseEntity类讲解(具体讲解返回给前端的一些事情)
本文讲解了SpringBoot中的`ResponseEntity`类,展示了如何使用它来自定义HTTP响应,包括状态码、响应头和响应体,以及如何将图片从MinIO读取并返回给前端。
61 3
|
1月前
|
SQL Java 数据库
Springboot+spring-boot-starter-data-jdbc实现数据库的操作
本文介绍了如何使用Spring Boot的spring-boot-starter-data-jdbc依赖来操作数据库,包括添加依赖、配置数据库信息和编写基于JdbcTemplate的数据访问代码。
50 2
|
1月前
|
XML Java 应用服务中间件
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
168 2