java--基于XML或者注解AOP

article/2024/4/20 15:52:43

1、基于动态代理实现

动态代理实现基本方式:https://blog.csdn.net/qq_34577961/article/details/128162372

2、面向切面AOP

2.1、基本步骤思路

1、引入依赖

基本依赖配置https://blog.csdn.net/qq_34577961/article/details/129152040?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22129152040%22%2C%22source%22%3A%22qq_34577961%22%7D

2、创建接口及其实现类

package com.ruqi.aoptest;import org.aspectj.lang.annotation.Aspect;public interface InterfaceTool {int add(int i, int j);int mul(int i, int j);
}============================
import org.springframework.stereotype.Component;@Component
public class InterfacetoolImpl implements InterfaceTool {@Overridepublic int add(int i, int j) {int res = i + j ;return res;}@Overridepublic int mul(int i, int j) {int res = i - j ;return res;}
}

3、创建切面类,设置切入点和通知类型

设置切入点解释如图

 切面类代码实现:

package com.ruqi.aoptest;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;@Aspect //表示为切面类
@Component
public class LogAspect {/*** 通知类型:* 前置类:@Before()* 返回类:@AfterReturning()* 异常类:@AfterThrowing()* 后置类:@After()* 环绕类:@Around()*/@Before(value = "execution(public int com.ruqi.aoptest.InterfacetoolImpl2.*(..))")public void beforeMethod(JoinPoint joinPoint){String methodName = joinPoint.getSignature().getName();System.out.println("这是一个前置操作,方法名为" + methodName);}@After(value = "execution(public int com.ruqi.aoptest.InterfacetoolImpl2.*(..))")public void afterMethod(JoinPoint joinPoint){String methodName = joinPoint.getSignature().getName();System.out.println("这是一个后置操作,方法名为" + methodName);}@AfterReturning(value = "execution(public int com.ruqi.aoptest.InterfacetoolImpl2.*(..))",returning = "result")public void afterrReturnMethod(JoinPoint joinPoint,Object result){
//        result 参数名要和注解定义的名称一致String methodName = joinPoint.getSignature().getName();System.out.println("这是一个返回值操作操作,方法名为" + methodName + ",该方法的返回值为:" + result);}@AfterThrowing(value = "execution(public int com.ruqi.aoptest.InterfacetoolImpl2.*(..))", throwing = "exception")public void afterThrowingMethod(JoinPoint joinPoint,Throwable exception){
//        exception 参数名要和注解定义的名称一致String methodName = joinPoint.getSignature().getName();System.out.println("这是一个异常值操作操作,方法名为" + methodName + ",该方法的异常信息为:" + exception);}@Around(value = "execution(public int com.ruqi.aoptest.InterfacetoolImpl2.*(..))")public Object aroundMethod(ProceedingJoinPoint joinPoint){Object result1 = null;String methodName = joinPoint.getSignature().getName();try{System.out.println("方法执行前的操作,相当于before()注解");result1 = joinPoint.proceed(); //获取目标方法的返回值System.out.println("方法执行前的操作,相当于before()注解");}catch (Throwable e){e.printStackTrace();System.out.println("方法出现异常的操作,相当于AfterThrowing()注解");}finally {System.out.println("方法后置的操作,相当于After()注解");}return result1; // 相当于AfterReturning()}
}

测试类:

package com.ruqi.aoptest;import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Testcase {@Testpublic void testBefore(){ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");InterfaceTool bean = context.getBean(InterfaceTool.class);bean.add(1,2);}
}

4、切面切入点重写

package com.ruqi.aoptest;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;@Aspect //表示为切面类
@Component
public class LogAspect {@Pointcut(value = "execution(* com.ruqi.aoptest.InterfacetoolImpl2.*(..))")public void pointCut(){}@After(value = "pointCut()") // 同个切面可以直接使用方法,否则需要使用全路径
//    @After(value = "com.ruqi.aoptest.LogAspect.pointCut()") public void afterMethod(JoinPoint joinPoint){String methodName = joinPoint.getSignature().getName();System.out.println("这是一个后置操作,方法名为" + methodName);}
}

5、有多个切面类时,可设置优先级

package com.ruqi.aoptest;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.junit.jupiter.api.Order;
import org.springframework.stereotype.Component;@Aspect //表示为切面类
@Component
public class LogAspectOrder {@Order(1) //数字越小,优先级越高@After(value = "pointCut()")public void afterMethod(JoinPoint joinPoint){System.out.println("优先级为第一");}@Pointcut(value = "execution(* com.ruqi.aoptest.InterfacetoolImpl2.*(..))")public void pointCut(){}
}

3、基于xml进行切面

1、将切面的相关注解删除后,使用xml配置即可

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd">
<!--    开启组件扫描--><context:component-scan base-package="com.ruqi.aoptest"></context:component-scan>
<!--配置切面类和切入表达式,以及相关通知--><aop:config><aop:aspect ref="logAspect"> <!--配置切面类,使用类名,首字母小写--><aop:pointcut id="pointcutId" expression="execution(public int com.ruqi.aoptest.InterfacetoolImpl2.*(..))"/> <!--配置切入表达式--> <aop:before method="beforeMethod" pointcut-ref="pointcutId"></aop:before><aop:after method="afterMethod" pointcut-ref="pointcutId"></aop:after><aop:after-returning method="afterReturnMethod" returning="result" pointcut-ref="pointcutId"></aop:after-returning><aop:after-throwing method="afterThrowingMethod" throwing="exception" pointcut-ref="pointcutId"></aop:after-throwing><aop:around method="aAroundMethod" pointcut-ref="pointcutId"></aop:around></aop:aspect></aop:config></beans>

http://www.ngui.cc/article/show-1007611.html

相关文章

内存泄漏 定位方法

目录 内存概念 物理内存 虚拟内存 内存泄漏 定位方法和手段 1.MemInFo MemTotal MemFree MemAvailable Cached 2 vmalloc info 3.Kmemleak 算法原理 使用方法 参考文献与链接&#xff1a; 如果你点进这篇文章&#xff0c;那么要么你是一个C\C程序员&#xff0c;…

如何通过检测微芯片操作来对抗硬件木马

在他们的项目中&#xff0c;研究人员拍摄了数千张微芯片的显微图像。图为采用金色芯片封装的芯片。被检查的芯片面积只有两平方毫米左右。 来自德国波鸿鲁尔大学和马克斯普朗克安全与隐私研究所 (MPI-SP) 的研究人员正在开创创新的检测技术来对抗这些硬件木马。 他们的先进算…

未佩戴安全带智能识别 opencv

未佩戴安全带智能识别通过pythonopencv网络模型识别分析技术&#xff0c;未佩戴安全带智能识别自动识别现场工地作业人员高空作业是否按要求佩戴安全带&#xff0c;不需人为干预自动抓拍告警同步提醒后台人员及时处理。OpenCV的全称是Open Source Computer Vision Library&…

WLAN速度突然变慢

目录 一、问题 二、在设置中重置网络 1. 按下组合键“WinI”打开设置&#xff0c;在设置窗口中点击“网络和Internet”。 2、点击左侧的“状态”&#xff0c;在右侧选择“网络重置”。 3、然后会进入“网络重置”页面&#xff0c;点击“立即重置”后点击“是”等待完成即可…

记一次悲催的负优化被清词经历以及自救过程

事情起因 事情的起因是这样的&#xff0c;我有一款产品运营了将近一年&#xff0c;经过产品迭代和不断优化&#xff0c;产品的新增逐渐增加起来&#xff0c;就在上个月好不容易迎来小高潮&#xff0c;在某个地区的几个热词排行里分别进了第 3 名 和 第 5 名。从此新增数据水涨…

vue2_mix混入的用法

文章目录背景minx混入使用1.定义了一个mix.js2. 定义一个组件混入mixmix的同享组件作用域this相同使用场景结尾背景 多个vue文件出现大量重复的函数和生命周期处理时使用mix混入 minx混入 当组件使用混入对象时&#xff0c;所有混入对象的选项将被“混合”进入该组件本身的选…

正则表达式学习,及部分样例

对于正则表达式,相信很多人都知道,但是很多人的第一感觉就是难学, 因为看第一眼时,觉得完全没有规律可寻,而且全是一堆各种各样的特殊 符号,完全不知所云。 其实只是对正则不了解而以,了解了你就会发现,原来就这样啊正则所用 的相关字符其实不多, 也不难记,更不难懂,…

Mysql快速上手一(基础知识、数据模型、数据类型、SQL语句)

文章目录MySQL基础知识基本概念本地mysql服务启动与停止客户端连接mysql数据模型关系型数据库数据模型数据类型SQL语句DDL表操作库操作DMLDQLDCL参考资料作为笔记&#xff0c;后面会持续更新该方面MySQL基础知识 基本概念 本地mysql服务启动与停止 这里的mysq对应的是window…

Dubbo--笔记1

Dubbo–笔记1 该笔记为看尚桂谷的视频简单记下的笔记&#xff1a; RPC: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6Ly611RY-1679724725006)(null)] 上面图中可以看出 影响RPC的因素主要有两个&#xff1a; 建立socket连接(也就是通讯效率)序…

简单linux 下 x64任意地址的inlinehook

背景最近工作需要hook函数&#xff0c;然后实现自己的逻辑&#xff0c;之前都是使用的frida来直接hook&#xff0c;但是这里发现&#xff0c;挂在frida之后对性能影响较大&#xff0c;可能是数十倍的影响&#xff0c;之前一直都没发现。所以这里必须自己实现一个hook参考这里参…