使用Aspect来对访问方法进行预处理和后处理

2024-05-16 15:08

本文主要是介绍使用Aspect来对访问方法进行预处理和后处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

例子摘自李刚老师的《JavaEE企业应用实战(第四版)》661页

使用aspect中的@Around、@Before、@After、@AfterReturning,例子如下
切面类

package com.aspect;import java.util.Arrays;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class FourAdviceTest {/*** 可以在执行方法之前和之后改变参数和返回值* @param joinPoint用于获取目标方法相关信息的参数* @return 最终的返回值* @throws Throwable*/@Around("execution(* com.service.*.*(..))")public Object processTx(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("Around增强:执行方法之前,模拟开始事物");Object[] args = joinPoint.getArgs();if(args != null && args.length > 0 && args[0].getClass() == String.class) {args[0] = "增加的前缀" + args[0];}Object rvt = joinPoint.proceed();System.out.println("Around增强:执行方法之后,模拟结束事物");if(rvt != null && rvt instanceof Integer) {rvt = (Integer)rvt * (Integer)rvt;}return rvt;}/*** 可以在执行方法之前对目标方法的参数进行判断* 通过抛出一个异常来阻断目标方法的访问* @param joinPoint*/@Before("execution(* com.service.*.*(..))")public void authority(JoinPoint joinPoint) {System.out.println("Before增强:模拟权限检查");System.out.println("Before增强:被织入增强处理的目标目标方法为:" + joinPoint.getSignature().getName());System.out.println("Before增强:目标方法的参数为:" + Arrays.toString(joinPoint.getArgs()));joinPoint.getArgs()[0] = "除了Around其他的都是是不可以修改目标方法的参数的";System.out.println("joinPoint.getArgs()[0]:"+joinPoint.getArgs()[0]);System.out.println("Before增强:目标方法的参数为:" + Arrays.toString(joinPoint.getArgs()));System.out.println("Before增强:被织入增强处理的目标对象为:" + joinPoint.getTarget());}/*** 可以在执行方法之后对目标方法的参数进行判断* @param joinPoint*/@After("execution(* com.service.*.*(..))")public void release(JoinPoint joinPoint) {System.out.println("After增强:模拟方法结束后的释放资源");System.out.println("After增强:被织入增强处理的目标方法为:" + joinPoint.getSignature().getName());System.out.println("After增强:目标方法的参数为:" + Arrays.toString(joinPoint.getArgs()));System.out.println("After增强:被织入增强处理的目标对象为" + joinPoint.getTarget());}/*** 与After的区别在于AfterReturning只有在方法执行成功的之后才会被织入,如果After和* AfterReturning同时存在于一个文件中,谁写在前面谁先运行* @param joinPoint* @param rvt方法的返回值*/@AfterReturning(pointcut="execution(* com.service.*.*(..))", returning="rvt")public void log(JoinPoint joinPoint, Object rvt) {System.out.println("AfterReturning增强:获取目标方法的返回值:" + rvt);System.out.println("AfterReturning增强:模拟日志功能");System.out.println("AfterReturning增强:获织入增强的目标方法为:" + joinPoint.getSignature().getName());System.out.println("AfterReturning增强:目标方法的参数为:" + Arrays.toString(joinPoint.getArgs()));System.out.println("AfterReturning增强:被织入增强处理的目标对象为:" + joinPoint.getTarget());}
}

Bean类

package com.service.impl;import org.springframework.stereotype.Component;import com.service.Hello;
@Component
public class HelloImpl implements Hello {@Overridepublic void hello() {// TODO Auto-generated method stubSystem.out.println("HelloImpl中的hello方法");}@Overridepublic int addUser(String name, String pass) {// TODO Auto-generated method stubSystem.out.println("执行Hello组件的addUser添加用户:" + name);if(name.length() < 3 || name.length() > 40) {throw new IllegalArgumentException("name的参数长度必须大于3小于10");}return 92;}
}

测试代码

        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");HelloImpl helloImpl = applicationContext.getBean("helloImpl", HelloImpl.class);helloImpl.addUser("Slience", "12");

执行效果
值得注意的是@After和@AfterReturning或者有多个@After和@AfterReturning如果同时存在于一个文件里,他们的执行顺序是从上到下依次执行的;还有就是这里面只有@Around可以修改目标方法的接收参数和返回值,其他的都不可以修改;还有就是可以使用@AfterThrowing来对目标方法抛出的异常进行捕获和操作。

这篇关于使用Aspect来对访问方法进行预处理和后处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/995254

相关文章

postgresql使用UUID函数的方法

《postgresql使用UUID函数的方法》本文给大家介绍postgresql使用UUID函数的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录PostgreSQL有两种生成uuid的方法。可以先通过sql查看是否已安装扩展函数,和可以安装的扩展函数

Java中Arrays类和Collections类常用方法示例详解

《Java中Arrays类和Collections类常用方法示例详解》本文总结了Java中Arrays和Collections类的常用方法,涵盖数组填充、排序、搜索、复制、列表转换等操作,帮助开发者高... 目录Arrays.fill()相关用法Arrays.toString()Arrays.sort()A

如何使用Lombok进行spring 注入

《如何使用Lombok进行spring注入》本文介绍如何用Lombok简化Spring注入,推荐优先使用setter注入,通过注解自动生成getter/setter及构造器,减少冗余代码,提升开发效... Lombok为了开发环境简化代码,好处不用多说。spring 注入方式为2种,构造器注入和setter

MySQL中比较运算符的具体使用

《MySQL中比较运算符的具体使用》本文介绍了SQL中常用的符号类型和非符号类型运算符,符号类型运算符包括等于(=)、安全等于(=)、不等于(/!=)、大小比较(,=,,=)等,感兴趣的可以了解一下... 目录符号类型运算符1. 等于运算符=2. 安全等于运算符<=>3. 不等于运算符<>或!=4. 小于运

使用zip4j实现Java中的ZIP文件加密压缩的操作方法

《使用zip4j实现Java中的ZIP文件加密压缩的操作方法》本文介绍如何通过Maven集成zip4j1.3.2库创建带密码保护的ZIP文件,涵盖依赖配置、代码示例及加密原理,确保数据安全性,感兴趣的... 目录1. zip4j库介绍和版本1.1 zip4j库概述1.2 zip4j的版本演变1.3 zip4

Python 字典 (Dictionary)使用详解

《Python字典(Dictionary)使用详解》字典是python中最重要,最常用的数据结构之一,它提供了高效的键值对存储和查找能力,:本文主要介绍Python字典(Dictionary)... 目录字典1.基本特性2.创建字典3.访问元素4.修改字典5.删除元素6.字典遍历7.字典的高级特性默认字典

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

Nginx安全防护的多种方法

《Nginx安全防护的多种方法》在生产环境中,需要隐藏Nginx的版本号,以避免泄漏Nginx的版本,使攻击者不能针对特定版本进行攻击,下面就来介绍一下Nginx安全防护的方法,感兴趣的可以了解一下... 目录核心安全配置1.编译安装 Nginx2.隐藏版本号3.限制危险请求方法4.请求限制(CC攻击防御)

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法