使用注解的AOP编程

使用注解的AOP编程

当注解没有参数时

当使用注解进行面向切面编程(AOP)时,你可以按照以下步骤来实现:

步骤:

1. 创建自定义注解:

首先,创建自定义的注解,以便在代码中标记需要进行横切操作的方法或类。

import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface MyCustomAnnotation {// 定义注解的属性(可选)
}
2. 创建切面类:

创建一个切面类,在切面类中定义相应的通知(advice),如 @Before@After@Around 等,以及指定切入点表达式来匹配需要执行横切逻辑的位置。

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;@Aspect
@Component
public class MyAspect {@Around("@annotation(com.example.MyCustomAnnotation)")public Object myAdvice(ProceedingJoinPoint joinPoint) throws Throwable {// 执行目标方法前的逻辑// 可以获取特定注解的信息,执行额外操作Object result = joinPoint.proceed(); // 执行目标方法// 执行目标方法后的逻辑// 可以处理目标方法执行后的结果或执行其他操作return result;}
}
3. 将切面类注册为 Spring Bean:

确保切面类被 Spring 容器管理,这样它才能够被应用到目标类的方法上。

4. 在目标类或方法上使用自定义注解:
@MyCustomAnnotation
public void myMethod() {// 这个方法会被切面拦截并执行 MyAspect 中定义的 myAdvice 方法的逻辑// 可以在此方法中定义业务逻辑
}
5. 运行程序:

确保 Spring 应用程序能够正常启动,并且切面逻辑能够被成功应用于被标记的方法或类中。

总结:

使用注解的 AOP 编程主要步骤包括:定义自定义注解,创建切面类并编写相应的通知方法和切入点表达式,将切面类注册为 Spring Bean,并在需要的目标方法或类上使用自定义注解。这样,切面类中定义的逻辑就可以在被标记的方法或类执行时生效,实现横切关注点的操作。

当注解有参数要获取里面的参数时

当使用注解进行面向切面编程(AOP)时,如果需要操作注解中的参数,可以按照以下步骤进行:

步骤:

1. 创建自定义注解:

首先,创建自定义的注解,并在注解中定义所需的属性,以便在被标记的方法或类中使用。

import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface MyCustomAnnotation {String value(); // 添加需要的参数
}
2. 创建切面类:

创建一个切面类,在切面类中定义相应的通知(advice),同时通过方法参数获取注解中的属性值。

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.AnnotationUtils;@Aspect
@Component
public class MyAspect {@Around("@annotation(myAnnotation)") // 通过参数获取注解public Object myAdvice(ProceedingJoinPoint joinPoint, MyCustomAnnotation myAnnotation) throws Throwable {String annotationValue = myAnnotation.value(); // 获取注解中的属性值// 执行目标方法前的逻辑// 可以使用注解中的属性值执行额外操作Object result = joinPoint.proceed(); // 执行目标方法// 执行目标方法后的逻辑// 可以处理目标方法执行后的结果或执行其他操作return result;}
}

代码中能够直接用@Around(“@annotation(myAnnotation)”) 的原因介绍:

在这段代码中,@Around("@annotation(myAnnotation)") 表达式使用了 AspectJ 的切入点表达式,其中 @annotation() 是用于匹配带有特定注解的方法的一种方式。这个表达式告诉切面,当被拦截的方法上存在指定的 myAnnotation 注解时,应该执行横切逻辑。

在这里,@Around 注解中的 @annotation(myAnnotation) 表达式中的 myAnnotation 是作为参数传入 myAdvice 方法的,表示该方法参数中的特定注解实例。

AspectJ 允许使用 @annotation() 来匹配带有特定注解的方法。当执行被切入点所匹配的方法时,切面会拦截该方法并执行 myAdvice 方法中定义的逻辑,同时允许通过 joinPoint.proceed() 执行原始方法。

在执行时,AspectJ会检查被拦截的方法上是否存在 myAnnotation 注解,并在满足条件时执行 myAdvice 中的逻辑。这样你可以在方法执行前后做一些额外的操作,例如权限校验、日志记录等。

简单来说就是原来对注解的匹配变成了从方法参数中取这个注解的定义了。

3. 将切面类注册为 Spring Bean:

确保切面类被 Spring 容器管理,这样它才能够被应用到目标类的方法上。

4. 在目标类或方法上使用自定义注解,并传递参数:
@MyCustomAnnotation(value = "someValue")
public void myMethod() {// 这个方法会被切面拦截并执行 MyAspect 中定义的 myAdvice 方法的逻辑// 可以在此方法中定义业务逻辑
}

总结:

  1. 定义自定义注解:在注解中添加需要的参数。
  2. 创建切面类:使用 @Around 或其他通知注解,在方法签名中加入注解类型的参数,通过该参数获取注解中的属性值。
  3. 将切面类注册为 Spring Bean:确保切面类被 Spring 容器管理。
  4. 在目标方法或类上使用自定义注解:使用自定义注解并传递所需的参数,这样切面就能够获取并操作注解中的参数信息。

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

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

相关文章

Excel换不了行怎么解决?

方法一: 使用Alt Enter键 在Excel中,输入文字时按下回车键,光标将会移到下一个单元格,如果想要换行,可以尝试使用Alt Enter键。具体操作如下: 1.在单元格中输入文字; 2.想要换行时,在需要换行的位置按下Alt Enter键; 3…

延时任务定时发布,基于 Redis 与 DB 实现

目录 1、什么是延时任务,分别可以使用哪些技术实现? 1.2 使用 Redis 和 DB 相结合的思路图以及分析 2、实现添加任务、删除任务、拉取任务 3、实现未来数据的定时更新 4、将数据库中的任务数据,同步到 Redis 中 1、什么是延时任务&#xff…

网络运维与网络安全 学习笔记2023.11.23

网络运维与网络安全 学习笔记 第二十四天 今日目标 VRRP负载均衡、BFD原理与配置、BFD典型应用 DHCP工作原理、全局模式DHCP VRRP负载均衡 VRRP单组缺陷 每网段存在一个VRRP组,缺点如下: 主网关数据转发压力大 备份网关不转发任何数据 网络设备利用…

Hook技术(钩子技术)

HOOK(钩子技术) 这里的hook我理解的意思就是通过拦截指令,将指令换成自己想要的指令,从而做道绕过原本的程序指令,要修改这个指令,要用汇编技术,从二进制入手。 扩展: 木马病毒之…

git clone慢的解决办法

在网站 https://www.ipaddress.com/ 分别搜索: github.global.ssl.fastly.net github.com 得到ip: 打开hosts文件 sudo vim /etc/hosts 在hosts文件末尾添加 140.82.114.3 github.com 151.101.1.194 github.global-ssl.fastly.net 151.101.65.194 g…

外部网关协议_边界网关协议BGP

一.边界网关协议BGP的基本概念 边界网关协议(Border Gateway Protocol,BGP)属于外部网关协议EGP这个类别,用于自治系统AS之间的路由选择协议。由于在不同AS内度量路由的“代价”(距离、带宽、费用等)可能不同,因此对于…

elasticsearch 7安装

问题提前报 max virtual memory areas error max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 如果您的环境是Linux,注意要做以下操作,否则es可能会启动失败 1 用编辑工具打开文件/etc/sysctl.conf 2 …

qml渲染引擎介绍

qml项目启动入口 Qt Quick项目qml脚本在C++代码里启动,main.cpp如下: #include <QGuiApplication> #include <QQmlApplicationEngine>int main(int argc, char *argv[]) {

VUE excel表格导出

js代码 //下载模板 downloadExl() { // 标题 const tHeader [‘xxx’,xxx,xx名称,电枪xx,协议xx,snxx]; // key const filterVal [agentName, stationName, equName, channelNumber, manufacturer, sn, ]; // 值 const datas [ { agentName: 你好, stationName: 我们, e…

激光雷达与惯导标定 | Lidar_IMU_Init : 编译

激光雷达与惯导标定&#xff1a;Lidar_IMU_Init 编译 功能包安装安装ceres-solver-2.0.0 &#xff08;注意安装2.2.0不行&#xff0c;必须要安装2.0.0&#xff09; LI-Init是一种鲁棒、实时的激光雷达惯性系统初始化方法。该方法可校准激光雷达与IMU之间的时间偏移量和外部参数…

unity shaderGraph实例-可交互瀑布

不要问我水在哪里&#xff0c;你自己相像这是一个瀑布&#xff0c;瀑布的效果我还不会做 效果展示 整体结构 这里片元着色器最后输出的baseColor应该是黑色&#xff0c;白色为错误。 各区域内容 区域1 计算球到瀑布的距离&#xff0c;然后减去一个值&#xff0c;实现黑色区域…

UNETR:用于三维医学图像分割的Transformer

论文链接&#xff1a;https://arxiv.org/abs/2103.10504 代码链接&#xff1a; https://monai.io/research/unetr 机构&#xff1a;Vanderbilt University, NVIDIA 最近琢磨不出来怎么把3d体数据和文本在cnn中融合&#xff0c;因为确实存在在2d里面用的transformer用在3d里面…

wpf使用CefSharp.OffScreen模拟网页登录,并获取身份cookie,C#后台执行js

目录 框架信息&#xff1a;MainWindow.xamlMainWindow.xaml.cs爬取逻辑模拟登录拦截请求Cookie获取 CookieVisitorHandle 框架信息&#xff1a; CefSharp.OffScreen.NETCore 119.1.20 MainWindow.xaml <Window x:Class"Wpf_CHZC_Img_Identy_ApiDataGet.MainWindow&qu…

API自动化测试:如何构建高效的测试流程

一、引言 在当前的软件开发环境中&#xff0c;API&#xff08;Application Programming Interface&#xff09;扮演了极为重要的角色&#xff0c;连接着应用的各个部分。对API进行自动化测试能够提高测试效率&#xff0c;降低错误&#xff0c;确保软件产品的质量。本文将通过实…

SpringMVC(三)

十、拦截器 1、拦截器的配置 SpringMVC中的拦截器用于拦截控制器方法的执行 SpringMVC中的拦截器需要实现HandlerInterceptor SpringMVC的拦截器必须在SpringMVC的配置文件中进行配置&#xff1a; <bean class"com.atguigu.interceptor.FirstInterceptor">…

constexpt

constexpt constexpt是C11引入的新的关键字&#xff0c;它用于在编译时而非运行时计算函数或变量的值。这个特性对于提高程序效率和优化代非常有用。 编译时常量和运行时常量 编译时常量&#xff08;Compile-time Constants&#xff09;和运行时常量&#xff08;Runtime Con…

8年经验之谈 —— 如何使用自动化工具编写测试用例?

以下为作者观点&#xff0c;仅供参考&#xff1a; 在快速变化的软件开发领域&#xff0c;保证应用程序的可靠性和质量至关重要。随着应用程序复杂性和规模的不断增加&#xff0c;仅手动测试无法满足行业需求。 这就是测试自动化发挥作用的地方&#xff0c;它使软件测试人员能…

leetcode做题笔记1410. HTML 实体解析器

「HTML 实体解析器」 是一种特殊的解析器&#xff0c;它将 HTML 代码作为输入&#xff0c;并用字符本身替换掉所有这些特殊的字符实体。 HTML 里这些特殊字符和它们对应的字符实体包括&#xff1a; 双引号&#xff1a;字符实体为 &quot; &#xff0c;对应的字符是 "…

python appium 官网下载

找了半天吐了 https://github.com/appium/appium-desktop/releases/tag/v1.22.3-4

Hibernate批量处理数据

概念&#xff1a; 批量处理数据是指在一个事务场景中处理大量数据。 在应用程序中难以避免进行批量操作&#xff0c;Hibernate提供了以下方式进行批量处理数据&#xff1a; (1)使用HQL进行批量操作 数据库层面 executeUpdate() (2)使用JDBC API进行批量操作 数据库层面 …