【Spring】手写一个简易starter

需求:

        自定义一个starter,里面包含一个@TimeLog注解和一个TimeLogAspect切面类,用于统计接口耗时。要求在其它项目引入starter依赖后,启动springboot项目时能进行自动装配。

步骤:

        (1)引入pom依赖

<dependencies><!-- starter想要有自动装配功能,就需要引入该依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId></dependency><!-- aop相关依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>

        (2)定义注解@TimeLog

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TimeLog {}

        @Target注解作用“对象”,这里声明注解作用在方法上。

        @Retention表示注解在运行时会被保留,可以通过反射机制读取。

        (3)定义切面类TimeLogAspect

@Aspect
@Component
public class TimeLogAspect {//切点:所有标注了TimeLog注解的方法@Pointcut("@annotation(com.hammajang.annotation.TimeLog)")public void timeConsume(){}@Around("timeConsume()")public Object doAround(ProceedingJoinPoint proceedingJoinPoint) {//开始时间long start = System.currentTimeMillis();Object result = null;try {//proceedingJoinPoint.proceed():真正的业务处理逻辑//result:业务的返回结果result = proceedingJoinPoint.proceed();} catch (Throwable e) {e.printStackTrace();}//结束时间long end = System.currentTimeMillis();System.out.println(proceedingJoinPoint.getSignature().getName() + "接口执行总耗时:" + (end - start) +"ms");return result;}
}

        @Aspect声明这是一个切面类。

        @Component声明这是一个bean,在项目启动时需要加载到Spring容器中。

        (4)定义TimeLogProperties

@ConfigurationProperties(prefix = "hammajang")
@Data
public class TimeLogProperties {/*** 日志开关*/private boolean enable;
}

        @ConfigurationProperties将配置文件中的属性绑定到 JavaBean(TimeLogProperties)中。注解声明了前缀是hammajang,获取以hammajang为前缀的所有参数进行自动匹配,赋值给类中对应的字段。

        (5)定义TimeLogAutoConfiguration

@Configuration
@ComponentScan(basePackages = "com.hammajang")
@ConditionalOnProperty(prefix = "hammajang",name = "enable",havingValue = "true")
@EnableConfigurationProperties(value = TimeLogProperties.class)
public class TimeLogAutoConfiguration {}

        @Configuration声明这是一个配置类(会被配置成bean,装载到spring容器中)。

        @ComponentScan扫描指定包路径(可以指定多个),将路径下符合要求的类对象配置成bean,装载到spring容器中。

        @ConditionalOnproperty表示配置文件中存在一个以"hammajang"为前缀的属性,属性名为"enable",当enable的值为true时(havingValue = "true"),才会将TimeLogAutoConfiguration配置类装载到spring容器中。

        @EnableConfigurationProperties启用指定配置类,value属性是一个class数组,表示可以启用多个配置类。

        (6)编译、打包starter

测试starter:

        (1)在pom文件中引入我们自定义的starter

        <dependency><groupId>com.hammajang</groupId><artifactId>my-spring-boot-starter</artifactId><version>1.0-SNAPSHOT</version></dependency>

        (2)在controller层编写测试接口

@RestController
@RequestMapping("/order")
public class OrderController {@GetMapping("/test")@TimeLogpublic String test(){try {System.out.println("测试TimeLog注解...");//模拟业务处理Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}return "success";}
}

        (3)测试@TimeLog注解是否生效

        测试结果

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

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

相关文章

【数据安全】金融行业数据安全保障措施汇总

数字化的今天&#xff0c;数据的价值不可估量&#xff0c;尤其是金融行业&#xff0c;数据不仅代表着企业的核心资产&#xff0c;还涉及到客户的隐私和信任。因此对于金融行业而言&#xff0c;保障数据安全至关重要。下面我们就来一起讨论为什么金融行业要保障数据安全&#xf…

leetcode 904. 水果成篮(优质解法)

代码&#xff1a; class Solution {public int totalFruit(int[] fruits) {int lengthfruits.length;int []fruitNumsnew int[length1]; //用于记录各个种类摘了多少个水果int count0; //用于记录当前采摘了几种水果int sum0; //用于记录当前共摘了多少水果for(int left0…

【操作系统和计网从入门到深入】(二)进程

前言 这个专栏其实是博主在复习操作系统和计算机网络时候的笔记&#xff0c;所以如果是博主比较熟悉的知识点&#xff0c;博主可能就直接跳过了&#xff0c;但是所有重要的知识点&#xff0c;在这个专栏里面都会提到&#xff01;而且我也一定会保证这个专栏知识点的完整性&…

【docker 】 安装docker(centOS7)

官网 docker官网 github源码 官网 在CentOS上安装Docker引擎 官网 在Debian上安装Docker引擎 官网 在 Fedora上安装Docker引擎 官网 在ubuntu上安装Docker引擎 官网 在RHEL (s390x)上安装Docker引擎 官网 在SLES上安装Docker引擎 最完善的资料都在官网。 卸载旧版本 …

【微信支付】商品支付流程实例

微信支付流程实例 0.准备 三种支付方式的流程梳理可见&#xff1a;微信支付三种常见支付方式流程梳理 微信支付准备过程中的重要参数&#xff1a; 选择【接入模式】参数申请&#xff1a; 【AppId】【商户号 mchid】完成以上两项参数的申请后&#xff0c;还需要绑定 AppId 与…

【操作系统到计网从入门到深入】(一)Linux基础知识预备

前言 这个专栏其实是博主在复习操作系统和计算机网络时候的笔记&#xff0c;所以如果是博主比较熟悉的知识点&#xff0c;博主可能就直接跳过了&#xff0c;但是所有重要的知识点&#xff0c;在这个专栏里面都会提到&#xff01;而且我也一定会保证这个专栏知识点的完整性&…

开源框架Apache NiFi调研

开源框架Apache NiFi调研 NiFi背景介绍一、什么是NiFi1.1 Apache NiFi特点&#xff1a;流管理、易用性、安全性、可扩展的体系结构和灵活的伸缩模型。1.2 Apache NiFi特性1.2 Apache NiFi核心概念1.3架构 二、NiFi的诞生&#xff0c;要致力于解决的问题有哪些&#xff1f;三、为…

家具制造ERP软件包含哪些功能?家具制造业ERP系统哪个好

不同的家具有不同的用料、品质、制造工时、营销渠道等&#xff0c;而有些家具制造企业采用传统的管理方式在处理物料BOM、生产实际成本核算、库存盘点、供应商选择、班组计件核对、生产领用以及物料追溯等方面存在不少提升空间。 与此同时也有很多的皮具制造企业借助ERP软件优…

class077 区间dp-下【算法】

class077 区间dp-下【算法】 算法讲解077【必备】区间dp-下 code1 括号区间匹配 // 完成配对需要的最少字符数量 // 给定一个由’[‘、’]‘、’(‘&#xff0c;’)‘组成的字符串 // 请问最少插入多少个括号就能使这个字符串的所有括号正确配对 // 例如当前串是 “([[])”&a…

【触想智能】工业显示器的日常维护及分类知识分享

工业显示器不同于普通商业显示器&#xff0c;它的结构比较复杂&#xff0c;如果在使用的过程中出现产品故障&#xff0c;我们怎么处理呢?今天小编为大家介绍工业显示器日常维护以及分类方面的知识&#xff0c;希望对大家有所帮助。 1、 工业显示器整机无电。这其实是一个非常简…

2023年最新prometheus + grafana搭建和使用+gmail邮箱告警配置

一、安装prometheus 1.1 安装 prometheus官网下载地址 sudo -i mkdir -p /opt/prometheus #移动解压后的文件名到/opt/,并改名prometheus mv prometheus-2.45 /opt/prometheus/ #创建一个专门的prometheus用户&#xff1a; -M 不创建家目录&#xff0c; -s 不让登录 useradd…

新型生成式 AI 助手 Amazon Q 为 IT 专业人士与开发人员提供有力支持(预览版)

今天&#xff0c;我们发布 Amazon Q 预览版&#xff0c;这是一款专用于企业级业务的全新生成式 AI 助手&#xff0c;可根据客户的业务量身定制。 Amazon Q 为开发人员和 IT 专业人员带来了多种支持功能。现在&#xff0c;使用 Amazon Q&#xff0c;即可在亚马逊云科技上构建应…