首页 > 其他分享 >SpringBoot自定义starter

SpringBoot自定义starter

时间:2024-12-25 15:31:32浏览次数:9  
标签:log 自定义 boot name true class starter SpringBoot

一.命名

推荐以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>

标签:log,自定义,boot,name,true,class,starter,SpringBoot
From: https://blog.csdn.net/Exill/article/details/144691889

相关文章

  • springboot毕设 智能公交系统app 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着城市化进程的加速,公共交通在城市居民出行中扮演着至关重要的角色。然而,传统的公交系统往往面临着信息不对称、调度效率低下以及乘客体验不佳等问......
  • springboot毕设 在线考试系统 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和教育信息化的不断推进,传统的考试模式逐渐暴露出诸多不便,如考试组织成本高、效率低下、资源分配不均等问题。特别是在当前......
  • springboot毕设 在线教育平台 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,教育领域正经历着前所未有的变革。在线教育平台作为这一变革的重要产物,凭借其便捷性、灵活性和资源的丰富性,迅速成为全球教......
  • Springboot旧衣捐赠平台设计与实现p40x5(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,公益活动,捐赠信息,物品分类,地区分类,捐赠数据,捐赠接收开题报告内容一、研究背景与意义研究背景随着经济的快速发展和消费意识的提高,旧衣物的废弃量不......
  • Springboot旧商品销售系统4104m(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,卖家,商品分类,商品信息开题报告内容一、项目背景与意义随着经济的快速发展和人们消费观念的转变,旧商品市场逐渐兴起。许多消费者开始注重资源的循环利用,......
  • Springboot旧教材交易系统a6151(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,书籍类型,书籍信息开题报告内容一、研究背景随着高等教育的普及和校园生活的丰富多彩,学生们在学习和生活中积累了大量的旧教材。这些旧教材对于个人而言,可......
  • 【开源免费】基于SpringBoot+Vue.JS学生评奖评优管理系统(JAVA毕业设计)
    本文项目编号T096,文末自助获取源码\color{red}{T096,文末自助获取源码}......
  • 【开源免费】基于SpringBoot+Vue.JS植物健康系统(JAVA毕业设计)
    本文项目编号T095,文末自助获取源码\color{red}{T095,文末自助获取源码}......
  • 如何创建自定义Retriever
    技术背景介绍老铁们,今天我们来聊聊在LLM应用中如何创建一个自定义的Retriever。很多时候,我们需要从外部数据源中检索信息,一个好的Retriever就是帮我们完成这个任务的关键。Retriever的任务是根据用户的查询来检索相应的Document,然后将这些文档格式化为提示信息,传递给LLM进......
  • 使用Excel制作通达信自定义“序列数据“
    序列数据的视频教程演示Excel制作通达信自定义序列数据1.序列数据的制作方法:删掉没有用的数据(行与列)和股代码格式处理,是和外部数据的制作方法是相同,自己上面看历史博文。只需要判断一下,股代码跟随的字符串,是前缀(字符串+股代码)还是后缀(股代码+字符串),然后对应的Excel命......