当前位置: 首页 > news >正文

Spring Boot手写starter

目录

  • 1.介绍
    • 1.1 什么是 Starter 机制?
    • 1.2 Starter 机制的工作原理?
  • 2.starter自定义
    • 2.1 新建工程
    • 2.2 自定义注解
    • 2.3 创建增强类
    • 2.4 创建自动配置类
    • 2.5 配置自动配置
    • 2.6 测试

1.介绍

1.1 什么是 Starter 机制?

Starter 机制是 Spring Boot 提供的一种约定优于配置的实现方式,可以抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置

starter让我们摆脱了各种依赖库的处理,需要配置各种信息的困扰。SpringBoot会自动通过classpath路径下的类发现需要的Bean,并注册进IOC容器

1.2 Starter 机制的工作原理?

当 Spring Boot 应用启动时,它会扫描 classpath 下的 META-INF/spring.factories 文件,查找所有标记为 org.springframework.boot.autoconfigure.EnableAutoConfiguration 的配置类。这些配置类中定义了应用所需的 Bean 和自动配置逻辑。

Spring Boot 会根据条件注解(如 @ConditionalOnClass@ConditionalOnMissingBean 等)来决定是否进行自动配置。

2.starter自定义

springboot 官方推荐使用格式:

  • springboot官方:spring-boot-starter-xxx
  • 第三方开发者自定义:xxxx-spring-boot-starter

自定义一个的启动器,包含一个自定义的记录方法执行时间的注解:logtimex-spring-boot-starter

2.1 新建工程

引入以下依赖:

 <!--日志-->
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId>
</dependency>
<!--aop相关-->
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId>
</dependency>
<!--工具类-->
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId>
</dependency>
<!--自动配置相关-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId>
</dependency>

2.2 自定义注解

package cn.smart.pagex.annotation;import java.lang.annotation.*;
@Target({ElementType.METHOD})		//放在方法上
@Retention(RetentionPolicy.RUNTIME)		//运行时注解可见(用于通过反射读取注解)
@Documentedpublic @interface PageX {String value() default "";
}

2.3 创建增强类

package cn.smart.logtimex.aop;import cn.hutool.core.date.StopWatch;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;@Component
@Aspect
@Slf4j
public class LogTimeXAop {//指定注解为切入点@Pointcut("@annotation(cn.smart.core.annotation.LogTimeX)")public void pointCut() {}@Around("pointCut()")public Object around(ProceedingJoinPoint pjp) throws Throwable {StopWatch stopWatch = new StopWatch();//开始计时stopWatch.start();//放行被增强的方法Object result = pjp.proceed();//结束计时stopWatch.stop();log.debug("方法执行时间:{}", stopWatch.getTotalTimeMillis());return result;}
}

2.4 创建自动配置类

package cn.smart.logtimex.autoconfiguration;import cn.smart.logtimex.aop.LogTimeXAop;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;@Configuration
@Import(LogTimeXAop.class)
//开关
//cn.smart.logtimex.enable = true
@ConditionalOnProperty(prefix = "cn.smart.logtimex",value = "enable", havingValue = "true", matchIfMissing = true)
public class LogTimeXAutoConfiguration { //领头羊
}

2.5 配置自动配置

resourecs文件目录下创建META-INF,并创建我们自己的spring.factories,并把我们的 LogTimeXAutoConfiguration 添加进去

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.smart.logtimex.autoconfiguration.LogTimeXAutoConfiguration

2.6 测试

在其他模块引入依赖

<!--输出执行时间--><dependency><groupId>cn.smart</groupId><artifactId>logtimex-spring-boot-starter</artifactId><version>0.0.1-SNAPSHOT</version></dependency>

application.properties配置文件中可以对我们的starter进行设置

//使starter有效,默认
cn.smart.logtimex.enable = true//使starter无效,原理就是控制是否进行自动配置
cn.smart.logtimex.enable = false

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【机器学习】在【Pycharm】中的实践教程:使用【逻辑回归模型】进行【乳腺癌检测】
  • 淘宝商品评论爬虫实战指南:基于Requests与Cookies的实现
  • 中英双语介绍伦敦金融城(City of London)
  • mac有什么解压软件 mac怎么解压7z软件 苹果电脑好用的压缩软件有哪些
  • python通过COM Interface控制CANoe
  • 【知识整理】4P4C4R营销战略
  • STM32 Cannot access memory
  • element-plus 2.7.6相关使用方式
  • linux screen
  • C#编程命名笔记
  • 1、Reids之基础
  • 苹果电脑畅玩《魔兽世界巫妖王之怒》怀旧服国服 PD虚拟机能玩魔兽世界吗 Mac电脑运行Windows游戏
  • GL823K USB 2.0 SD/MSPRO读卡器控制芯片
  • Explore Synapse
  • 【课程总结】Day13(下):人脸识别和MTCNN模型
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • 【知识碎片】第三方登录弹窗效果
  • HTTP那些事
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Java 多线程编程之:notify 和 wait 用法
  • js ES6 求数组的交集,并集,还有差集
  • node.js
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 对象管理器(defineProperty)学习笔记
  • 工作中总结前端开发流程--vue项目
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 实现菜单下拉伸展折叠效果demo
  • 使用 Docker 部署 Spring Boot项目
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • ​iOS安全加固方法及实现
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (+4)2.2UML建模图
  • (42)STM32——LCD显示屏实验笔记
  • (8)STL算法之替换
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (十一)图像的罗伯特梯度锐化
  • (循环依赖问题)学习spring的第九天
  • (一) springboot详细介绍
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (自用)仿写程序
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .Family_物联网
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .net refrector
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .NET开源纪元:穿越封闭的迷雾,拥抱开放的星辰
  • [12] 使用 CUDA 进行图像处理
  • [2016.7.Test1] T1 三进制异或
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [240727] Qt Creator 14 发布 | AMD 推迟 Ryzen 9000芯片发布
  • [383] 赎金信 js
  • [acwing周赛复盘] 第 69 场周赛20220917