【Annotation】SpringBoot自定义注解

1. 自定义注释是基于SpringAOP实现的

Spring AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的一个强大功能模块,它实现了AOP编程模型,允许开发者将横切关注点(如日志记录、事务管理、安全性检查、性能监控等)从业务逻辑中分离出来,以提高代码的模块化程度、可维护性和可重用性。

核心概念

  • 切面(Aspect):切面是跨越多个对象的关注点模块化方式的实现。它封装了横切关注点,比如事务管理就是企业级应用中的一个关注点,它可能会影响到多个对象的操作。
  • 连接点(Joinpoint):在程序执行过程中的某个特定点,如方法调用或异常抛出等,其中可以插入切面代码。Spring AOP只支持方法执行作为连接点。
    切入点(Pointcut):切入点定义了切面在何处应用,即匹配连接点的一组规则。通过表达式来指定哪些方法或类应该被切面影响。
  • 通知(Advice):在切面识别到特定的连接点时执行的动作。有五种类型的通知:
    • 前置通知(Before):在目标方法被调用之前执行。
    • 后置通知(After):在目标方法执行完毕后(无论是否发生异常)执行。
    • 返回通知(AfterReturning):在目标方法成功执行后执行。
    • 异常通知(AfterThrowing):在目标方法抛出异常后执行。
    • 环绕通知(Around):围绕着目标方法执行,在方法调用前后都可以进行自定义操作,还可以决定是否继续执行目标方法。
  • 织入(Weaving):将切面代码插入到应用程序代码中的过程。Spring AOP支持两种织入方式:编译期织入和运行时织入,Spring采用的是运行时织入,即在应用运行时通过动态代理来实现。
    实现方式

Spring AOP提供了两种代理方式来实现切面逻辑的织入:

  • JDK动态代理:当目标对象实现了至少一个接口时,Spring会使用JDK动态代理技术创建代理对象。这种方式的代理对象需要与目标对象实现相同的接口。
  • CGLIB代理:如果目标对象没有实现接口,Spring会使用CGLIB库来创建目标对象的子类代理。这种方式对于没有接口的类同样适用,但要求目标类不能是final的,且必须有默认构造函数。

使用Spring AOP

在Spring中使用AOP,通常涉及定义切面类(使用@Aspect注解标记)、定义切入点(使用@Pointcut注解)、以及在切点上应用通知(使用如@Before、@After等注解)。通过这些配置,Spring框架会在运行时自动创建代理对象,将切面逻辑编织进目标对象的方法调用流程中,从而实现非侵入式的横切关注点管理。

2. 使用自定义注释

步骤1: 定义自定义注解

首先,我们定义一个自定义注解@LogExecutionTime,用于标记需要记录执行时间的方法。

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecutionTime {
}

步骤2: 创建切面类

接着,我们创建一个切面类LoggingAspect,使用@Aspect注解标记,并在其中定义切点和通知逻辑。

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;@Aspect
@Component
public class LoggingAspect {private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);@Around("@annotation(LogExecutionTime)")public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {long start = System.currentTimeMillis();Object proceed = joinPoint.proceed(); // 执行原方法long elapsedTime = System.currentTimeMillis() - start;logger.info("Method {} executed in {} ms", joinPoint.getSignature().getName(), elapsedTime);return proceed;}
}

步骤3: 应用自定义注解

现在,我们可以在任何想要记录执行时间的方法上使用@LogExecutionTime注解。

@Service
public class MyService {@LogExecutionTimepublic String performTask() {// 模拟耗时操作try {Thread.sleep(1000);} catch (InterruptedException e) {Thread.currentThread().interrupt();throw new RuntimeException(e);}return "Task completed!";}
}

步骤4: 配置Spring启用AOP

确保Spring知道要使用AOP。

@Configuration
@EnableAspectJAutoProxy
public class AppConfig {// 其他配置...
}

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

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

相关文章

新火种AI|苹果要将苹果智能做成AI时代的APP Store?

作者:一号 编辑:美美 苹果还是想要自己做AI时代的“APP Store”。 自从去年开始落了队,苹果现在AI上开始高歌猛进。今年WWDC上展示的AI产品和与OpenAI的合作只是开始。有消息称,苹果正与Meta等AI巨头展开深入合作,这…

随想录 Day 74 Floyd / A*

随想录 Day 74 Floyd / A* Bellman_ford 队列优化 97. 小明逛公园 时间限制:1.000S 空间限制:256MB 题目描述 小明喜欢去公园散步,公园内布置了许多的景点,相互之间通过小路连接,小明希望在观看景点的同时&#xff…

小和问题和逆序对问题

小和问题和逆序对问题 小和问题, 在一个数组中,每一个数左边的数中比当前数小的数累加起来,叫做这个数组的小和,求一个数组的小和 直接遍历: int littleSum1(int* arr, int L, int R) {int temp 0;for (int i L; …

Spring底层原理之bean的加载方式四 @import 注解

bean的加载方式四 import 第四种bean的导入方式 是import导入的方式 在配置类上面加上注解就行 package com.bigdata1421.config;import com.bigdata1421.bean.Dog; import org.springframework.context.annotation.Import;Import(Dog.class) public class SpringConfig4 {…

CesiumJS【Basic】- #041 绘制纹理线(Entity方式)- 需要自定义着色器

文章目录 绘制纹理线(Entity方式)- 需要自定义着色器1 目标2 代码2.1 main.ts3 资源文件绘制纹理线(Entity方式)- 需要自定义着色器 1 目标 使用Entity方式绘制纹理线 2 代码 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium.Viewer

Java并发编程:最佳实践与性能优化

Java并发编程:最佳实践与性能优化 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 介绍并发编程 在当今软件开发中,多核处理器和分布式…

K8S学习教程(一):使用PetaExpress云服务器安装Minikube 集群题

什么是Minikube Minikube是一款工具,主要用于在本地运行 Kubernetes 集群。Kubernetes 开源的平台,用于自动化容器化应用的部署、扩展和管理,而Minikube 使得开发人员能够在本地机器上轻松创建一个单节点的 Kubernetes 集群,从而…

【高级篇】第6章 Elasticsearch 高级查询与搜索优化

在Elasticsearch的深入应用之旅中,掌握高级查询技巧与优化搜索性能是提升数据处理效率的关键。本章将带你深入探索Elasticsearch的高级查询特性,揭示搜索性能优化的奥秘,以及如何利用高亮与建议API增强用户体验。 6.1 复杂查询 6.1.1 Nested查询 Nested基本概念与用法: …

IT设备监控模板:支持多种监控工具和平台的集成和整合

IT设备监控模板管理在支持多种监控工具和平台方面发挥着关键作用,它通过提供统一的配置和管理界面,使运维人员能够灵活地适应和整合不同的监控工具和平台。以下是IT设备监控模板管理如何支持多种监控工具和平台的具体方式: 一、抽象化和标准…

如何使用AI学习一门编程语言?

无论你是软件开发新手还是拥有几十年的丰富经验,总是需要学习新知识。TIOBE Index追踪50种最受欢迎的编程语言,许多生态系统为职业发展和横向转型提供了机会。鉴于现有技术具有的广度,抽空学习一项新技能并有效运用技能可能困难重重。 最近我…

ARCGIS python 裁剪栅格函数 arcpy.management.Clip

ARCGIS python 裁剪栅格函数 arcpy.management.Clip 1 功能 裁剪掉栅格数据集、镶嵌数据集或图像服务图层的一部分。 2 使用情况 基于模板范围提取部分栅格数据集,输出与模板范围相交的所有像素使用以 x 和 y 坐标的最小值和最大值确定的包络矩形或使用输出范围文…

MATLAB-振动问题:单自由度阻尼振动系统受迫振动

一、基本理论 二、MATLAB实现 单自由度阻尼振动系统受迫振动,MATLAB代码如下: clear; clc; close allA 1; psi 0; F0 10; D 20; Rm 0.5; M 1; omega 2; delta Rm / (2*M); omega0 sqrt(D / M); Omega sqrt(omega0^2 - delta^2); Zm Rm i *…

多线程的三种创建方式

继承Thread类的方式进行实现 public class MyThread extends Thread{ Override public void run(){//多线程具体业务逻辑} }在main方法里面创建子类对象,开启线程 public static void main(String[] args) {MyThread t1 new MyThread(); MyThread t2 new MyThrea…

LLM大模型工程师面试经验宝典--基础版(2024.7月最新)

1.简单介绍一下大模型【LLMs】? 大模型:一般指1亿以上参数的模型,但是这个标准一直在升级,目前万亿参数以上的模型也有了。大语言模型(Large Language Model,LLM)是针对语言的大模型。 2.目前主…

基于布雷格曼偏差校正技术的全变分一维时间序列信号降噪方法(MATLAB R2018A)

信号降噪是信号处理的重要步骤之一,目的是提高所获得信号数据的质量,以达到更高的定性和定量分析精度。信号降噪能提升信号处理其他环节的性能和人们对信息识别的准确率,给信号处理工作提供更可靠的保证。信号降噪的难点是降低噪声的同时也会…

69. x 的平方根(简单)

69. x 的平方根 1. 题目描述2.详细题解3.代码实现3.1 Python方法一:逐个遍历方法二:二分查找 3.2 Java 1. 题目描述 题目中转:69. x 的平方根 2.详细题解 不能使用系统内置的函数,寻找某个数(假定为x)的…

网络请求的高效处理:C++ libmicrohttpd库详解

一、libmicrohttpd简介 libmicrohttpd是一个小型的C语言库,用于创建HTTP服务器和客户端。它提供了HTTP 1.1协议的完整实现,包括持久连接、管道化请求、虚拟主机等特性。libmicrohttpd的特点是: 轻量级:易于集成到C或C项目中。跨…

微信好友不小心拉黑了?这样操作,友谊的小船不会翻

在数字化时代,微信已成为我们社交生活的核心,它不仅连接着亲朋好友,更承载着我们的情感与回忆。 然而,情绪波动时,我们可能会一时冲动,将某些好友误送入黑名单。但别担心,今天,就让…

IMU在手语识别中的应用

近期,一款由美国和中国科研团队联合研发的新型的穿戴设备——SignRing,以其独特的IMU(惯性测量单元)技术,为聋哑人士的手语识别带来了革命性的突破。SignRing不仅极大地扩展了手语识别的词汇量,更提高了识别…

二维数组-----螺旋性矩阵输出

题目有点难,ok其实是很难。。。 观察样例输出,不难发现,螺旋数组中元素的递增轨迹为:右右右、下下下、左左左、上上上 简明为:右、下、左、上。可以设开始递增的元素1的位置为(x,y)&#xff0c…