SpringBoot自定义starter方式

 更新时间:2025年02月18日 11:00:26   作者:Exill  
本文介绍了如何创建一个自定义的Spring Boot Starter,以实现日志功能,通过使用SPI机制,可以在不修改启动类的情况下,实现自动配置和功能导入,同时,还讨论了如何在自定义Starter中编写必要的配置文件和注解,以确保功能的正确实现和配置的智能提示

命名

推荐以xxx-spring-boot-starter命名

原理

引入spring-boot-starter-jdbc后可直接使用DataSource

1.加载自动配置类

通过SPI(Service Provider Interface,Java提供的服务发现机制,用于框架拓展和组件替换)原理

(1)@SpringBootApplication->@EnableAutoConfiguration->@Import

(2)@Import通过AutoConfigurationImportSelector::selectImports方法导入自动配置类

(3)在AutoConfigurationImportSelector::getCandidateConfigurations方法中得知导入的自动配置类在从META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件读取

(4)其中包含DataSourceAutoConfiguration类

2.通过xxxAutoConfiguration再导入功能所需的bean

(1)

DataSourceAutoConfiguration->@EnableConfigurationProperties(DataSourceProperties.class)

将Properties类生效,读取application.yml中数据(url、username、password...)

(2)

@Import({ DataSourceConfiguration.Hikari.class... }) 

导入各种连接池,根据条件注解生效不同连接池

自定义starter

示例:@Log的添加日志功能封装成starter

1.创建标准SpringBoot项目引入所需依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

2.编写Properties类

@Data
@Component
@ConfigurationProperties("log")
public class LogProperties{
    private Boolean classFullName= true; //日志展示全类名
    private Boolean showUseTime= true; //日志展示方法执行时间
}

3.编写application.yml配置文件

log:
    class-full-name: true #展示全类名
    show-use-time: true #展示方法执行时间

4.编写@Log注解

@Target(METHOD) //该注解只能用于方法上
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface Log{}

5.编写AOP实现具体功能

@Slf4j
@Aspect
@Component
public class LogAop {
    @Resource
    private LogProperties logProperties;

    @Around("@annotation(com.gok.log.annotation.Log)")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        long beginTime = System.currentTimeMillis();
        Class targetClass = joinPoint.getSignature().getDeclaringType();
        String functionName = joinPoint.getSignature().getName();
        String name = (logProperties.getClassFullName() ? targetClass.getName() : targetClass.getSimpleName()) + "#" + functionName;
        try {
            log.info("{}开始", name);
            Object res = joinPoint.proceed(joinPoint.getArgs());
            log.info("{}结束", name);
            return res;
        } catch (Throwable t) {
            log.info("{}异常," + t.getMessage(), name);
            throw t;
        } finally {
            if (logProperties.getShowUseTime()) {
                log.info("{}执行时间:{}ms", name, System.currentTimeMillis() - beginTime);
            }
        }
    }
}

SpringBoot默认只扫描启动类所在目录,而Log实现所在的包不会扫描,有@Component也无效

所以通过原理中的SPI机制导入

6.删除LogProperties类和LogAop类的@Component注解

统一在LogAutoConfiguration导入

@Configuration
//引入Properties类
@EnableConfigurationProperties(LogProperties.class)
//引入Aop
@Import(LogAop.class)
public class LogAutoConfiguration  {
}

7.编写文件

编写META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件

引入自动配置类com.gok.logstarter.config.LogAutoConfiguration

8.删除SpringBoot启动类(main方法所在类)、删除pom.xml<build>标签

原因:作为starter不需要启动类

9.补充

(1)自定义starter的application.yml可以删除,最终生效的是引入starter项目中application.yml

(2)如果希望实现编写application.yml文件智能提示,需要在自定义starter的pom.xml添加如下依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java如何实现多线程的顺序执行

    java如何实现多线程的顺序执行

    多线程是java的一种重要技术,但是多线程的运行是没有绝对的顺序的,那么java如何实现多线程的顺序执行,下面就一起来了解一下
    2021-05-05
  • 谈谈Spring AOP中@Aspect的高级用法示例

    谈谈Spring AOP中@Aspect的高级用法示例

    在Spring AOP中目前只有执行方法这一个连接点,下面这篇文章主要给大家介绍了关于Spring AOP中@Aspect的高级用法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-08-08
  • Java并发框架中的AQS详细解析

    Java并发框架中的AQS详细解析

    这篇文章主要介绍了Java并发框架中的AQS详细解析,之前说锁的升级的时候,说到了自旋锁会空转几次尝试等待获取资源,其实这一系列的动作是有一个规范的这个规范叫做同步发生器AbstractQueuedSynchronizer ,简称AQS,需要的朋友可以参考下
    2024-01-01
  • Java 8 引入lambda表达式的原因解析

    Java 8 引入lambda表达式的原因解析

    这篇文章主要介绍了Java 8 引入lambda表达式的原因解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • linux下执行java程序的sh脚本分享

    linux下执行java程序的sh脚本分享

    这篇文章主要介绍了linux下执行java程序的sh脚本,仅供参考,但是设置的时候环境变量是最重要的,我就是环境变量一直不对,总是按网上查到的来,不明白怎么回事,才一直出错,其实环境变量就是你要执行的java程序所在的位置
    2014-09-09
  • SpringBoot集成jjwt和使用方式

    SpringBoot集成jjwt和使用方式

    本文详细介绍了JWT依赖(以jjwt为例)的引入和使用方法,首先,需要在项目中引入jwt依赖,随后在Spring的启动类application.yml中进行相应配置,最后,提供了一份完整的jwt工具类代码,供读者直接使用,以上内容便是作者的个人经验分享,期望能为读者提供参考并得到支持
    2024-10-10
  • Java实现List分组的常见方法详解

    Java实现List分组的常见方法详解

    这篇文章主要为大家详细介绍了使用Java实现List分组的几个常见方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-12-12
  • 详解Java二叉排序树

    详解Java二叉排序树

    这篇文章主要介绍了Java二叉排序树,包括二叉排序树的定义、二叉排序树的性质、二叉排序树的插入和查找等,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • springboot使用shiro-整合redis作为缓存的操作

    springboot使用shiro-整合redis作为缓存的操作

    这篇文章主要介绍了springboot使用shiro-整合redis作为缓存的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • SpringBoot application.yml配置文件使用及说明

    SpringBoot application.yml配置文件使用及说明

    本文详细介绍了SpringBoot application.yml 配置文件的使用和配置项,包括创建 application.yml 文件、配置数据源、数据库、缓存、邮件服务等,适合希望深入了解SpringBoot配置文件的开发者阅读
    2025-12-12

最新评论