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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/42067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BulingBuling - 作息安排 [Reset Your Routine] - 1

The Blinkist Team: [ Reset Your Routine ] 如果你发现自己很难按部就班&#xff0c;或者陷入工作效率低的困境&#xff0c;那么你可能需要重新调整一下作息时间&#xff01;从睡眠和营养&#xff0c;到待办事项和井井有条--本指南为你提供了各种技巧和策略&#xff0c;让你的…

自然之美无需雕琢

《自然之美&#xff0c;无需雕琢 ”》在这个颜值至上的时代&#xff0c;但在温馨氛围中&#xff0c;单依纯以一种意想不到的方式&#xff0c;为我们诠释了自然之美的真谛。而医生的回答&#xff0c;如同一股清流耳目一新。“我说医生你看我这张脸&#xff0c;有没有哪里要动的。…

【数据结构(邓俊辉)学习笔记】高级搜索树01——伸展树

文章目录 1. 逐层伸展1. 1 宽松平衡1. 2 局部性1. 3 自适应调整1. 4 逐层伸展1. 5 实例1. 6 一步一步往上爬1. 7 最坏情况 2. 双层伸展2.1 双层伸展2.2 子孙异侧2.3 子孙同侧2.4 点睛之笔2.5 折叠效果2.6 分摊性能2.7 最后一步 3 算法实现3.1 功能接口3.2 伸展算法3.3 四种情况…

linux下的网络编程

网络编程 1. 网络基础编程知识1.1网络字节序问题1.2 常用socket编程接口1.2.1 sockaddr1.2.2 ip地址转换函数1.2.4 socket()1.2.3 bind()1.2.4 listen()1.2.5 accept()1.2.6 connect() 1.3 以udp为基础的客户端连接服务器的demo1.4 以udp为基础的的服务器聊天室功能demo1.5 基于…

Spark SQL----内置函数Conversion Functions Conditional Functions

Spark SQL----内置函数Conversion Functions& Conditional Functions Conversion Functions 例子&#xff1a; -- cast SELECT cast(10 as int); --------------- |CAST(10 AS INT)| --------------- | 10| ---------------Conditional Functions 例子&#x…

Apispec,一个用于生成 OpenAPI(Swagger)规范的 Python 库

目录 01什么是 Apispec&#xff1f; 为什么选择 Apispec&#xff1f; 安装与配置 02Apispec 的基本用法 生成简单的 API 文档 1、创建 Apispec 实例 2、定义 API 路由和视图 3、添加路径到 Apispec 集成 Flask 和 Apispec 1、安装…

Spring Boot与Jenkins的集成

Spring Boot与Jenkins的集成 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 一、引言 Jenkins作为一个开源的持续集成&#xff08;CI&#xff09;和持续交付…

计算机行业现状分析与发展前景

一、行业竞争现状 技术创新不断涌现&#xff1a;计算机行业在技术创新方面取得了长足的进步&#xff0c;如云计算、大数据、人工智能、物联网等前沿技术不断涌现&#xff0c;这些技术不仅推动了行业的快速发展&#xff0c;也为传统产业的转型升级提供了有力支撑。 行业竞争日益…

Linux开发:进程间通过Unix Domain Socket传递数据

进程间传递数据的方式有很多种,Linux还提供一种特殊的Socket用于在多进程间传递数据,就是Unix Domain Socket(UDS)。 虽然通过普通的Socket也能做到在多进程间传递数据,不过这样需要通过协议栈层的打包与拆包,未免有些浪费效率,通过UDS,数据仅仅通过一个特殊的sock文件…

熔断降级处理

什么是熔断降级 微服务雪崩效应 当微服务运行不正常&#xff0c;会导致无法正常调用微服务&#xff0c;此时会出现异常&#xff0c;如果这种异常不去处理&#xff0c;可能会导致雪崩效应 微服务的雪崩效应表现在服务与服务之间调用&#xff0c;当其中一个服务无法提供服务时…

FreeU: Free Lunch in Diffusion U-Net——【代码复现】

这篇文章发表于CVPR 2024&#xff0c;官网地址&#xff1a;ChenyangSi/FreeU: FreeU: Free Lunch in Diffusion U-Net (CVPR2024 Oral) (github.com) 一、环境准备 提前准备好python、pytorch环境 二、下载项目依赖 demo下有一个requirements.txt文件&#xff0c; pip inst…

Symfony框架:优雅构建PHP应用的强有力工具

在PHP开发的广阔天地中&#xff0c;Symfony框架以其高性能、高安全性和组件化的特点&#xff0c;成为了构建现代Web应用的热门选择。Symfony是一个基于MVC&#xff08;模型-视图-控制器&#xff09;模式的全栈框架&#xff0c;提供了一套丰富的功能和工具&#xff0c;帮助开发者…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第55课-芝麻开门(语音 识别 控制3D纪念馆开门 和 关门)

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第55课-芝麻开门&#xff08;语音识别控制3D纪念馆开门和关门&#xff09; 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtn…

2.pwn的linux基础(计算机内部数据结构存储形式)

linux基础 保护层级: 分为四个ring0-ring3 一般来说就两个&#xff0c;0和3 0为内核 3为用户 权限: 用户分为多个组 文件和目录等等的权限一般都是三个&#xff0c;即可读可写可执行。 读:R&#xff0c;写:W&#xff0c;执行:X 赋予一个可执行文件执行权限就是chmod x file…

qt 如何添加子项目

首先我们正常流程创建一个项目文件&#xff1a; 这是我已经创建好的&#xff0c;请无视红线 然后找到该项目的文件夹&#xff0c;在文件夹下创建一个文件夹&#xff0c;再到创建好的文件夹下面创建一个 .pri 文件&#xff1a; &#xff08;创建文件夹&#xff09; &#xff08…

字节跳动与南开联合开源 StoryDiffusion:一键生成漫画和视频故事的神器!完全免费!

大家好&#xff0c;我是程序员X小鹿&#xff0c;前互联网大厂程序员&#xff0c;自由职业2年&#xff0c;也一名 AIGC 爱好者&#xff0c;持续分享更多前沿的「AI 工具」和「AI副业玩法」&#xff0c;欢迎一起交流~ 漫画&#xff0c;是多少人童年的回忆啊&#xff01; 记得小学…

#数据结构 链式栈

1. 概念 链式栈LinkStack 逻辑结构&#xff1a;线性结构物理结构&#xff1a;链式存储栈的特点&#xff1a;后进先出 栈具有后进先出的特点&#xff0c;我们使用链表来实现栈&#xff0c;即链式栈。那么栈顶是入栈和出栈的地方&#xff0c;单向链表有头有尾&#xff0c;那我…

Http中get与post的区别,99%的人都理解错了吧

Get和Post是HTTP请求的两种基本方法&#xff0c;要说它们的区别&#xff0c;接触过WEB开发的人都能说出一二。 最直观的区别 就是Get把参数包含在URL中&#xff0c;Post通过request body传递参数。 你可能自己写过无数个Get和Post请求&#xff0c;或者已经看过很多权威网站总…

【ARMv8/v9 GIC 系列 5.7 -- 中断路由与系统寄存器】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 Interrupt routing and System register access与Group 0中断相关的寄存器与Group 1中断相关的寄存器公共寄存器Interrupt routing and System register access 在执行AArch64状态时,中断路由到异常级别(Exception Level)是由以…

容器:stack

以下是关于stack容器的一些总结&#xff1a; stack容器比较简单&#xff0c;主要包括&#xff1a; 1、构造函数&#xff1a;stack [staName] 2、添加、删除元素: push() 、pop() 3、获取栈顶元素&#xff1a;top() 4、获取栈的大小&#xff1a;size() 5、判断栈是否为空&#x…