Spring AOP核心概念与实践指南
面向切面编程(AOP)作为Spring框架的核心功能之一,为处理横切关注点提供了优雅的解决方案。在业务系统开发中,日志记录、事务管理等通用功能往往分散在各处,AOP通过将这些功能模块化,显著提升了代码的可维护性和复用性。
本指南精选了Spring AOP最核心的知识点,包括切面配置、五种通知类型的使用场景以及参数处理技巧。内容经过精心提炼,去除冗余信息,保留最具实践价值的部分,帮助开发者快速掌握AOP的核心应用。
无论您是初次接触AOP,还是希望系统梳理相关知识,这份指南都能为您提供清晰的学习路径。我们将从基础配置开始,逐步深入到环绕通知等高级特性,每个知识点都配有典型代码示例,确保理论能够立即转化为实践能力。
一、基础知识
连接点:可以是程序执行时的任意位置
在springboot中可以特指方法的执行
切入点:需要进行匹配的方法
通知:需要加入的信息写在里面
切面:描述通知与切入点的对应关系
二、基础程序的创建
1、myadvice
@Component
@Aspect
public class myadvice {
@Pointcut("execution(void com.service.AopService.updates())")
private void pd(){}
@Before("pd()")
public void method(){
System.out.println(System.currentTimeMillis());
}
}
@Component 设置为bean方法已进行实现
@Aspect 设置整个 类型为切面
@Pointcut(“execution(void com.service.AopService.updates())”) 设置切面的位置
void表示类型 后面到具体位置的方法
private void pd(){} 别名的设置,相当于将所在位置的方法设置为这个别名
@Before(“pd()”) 设置执行的顺序
public void method(){
System.out.println(System.currentTimeMillis());
}
设置要实现的方法
2、xml
@Configuration
@ComponentScan("com")
@EnableAspectJAutoProxy()
public class xml {
}
@EnableAspectJAutoProxy() 开启aspects的自动代理
三、工作流程
代理表现
System.out.println(bean.getClass());
bean.getClass获取的内容即可查看是否为代理对象
四、AOP表达式的格式
1、切入点的两种表达方式
类中:
@Pointcut("execution(void com.service.AopService.updates())")
接口中:
@Pointcut("execution(void com.service.impl.AOpServiceimpl.updates())")
2、标准格式
注意:方法返回类型千万不能忘记
3、 符号代替描述
1、*
可以代替一整个类或方法,也可以代替后缀前缀
2、…
匹配的范围更大,可以将多个类路径一起描述,也可以说明是否有值,不用像*必须确定个数
4、书写技巧
描述返回类型为public时可以省略不写
返回类型为增删改时用精准匹配,为查询时用*匹配
包名中尽量不使用…,匹配效率太低
接口名采用 * 匹配,如*service
五、AOP的通知类型
1、前置通知
@Before()
在事务的前面进行实现
2、后置通知
@After
在事务的后面进行
3、环绕通知(重点)
@Around("pd()")
public Object method(ProceedingJoinPoint pro) throws Throwable {
System.out.println(System.currentTimeMillis());
Object proceed = pro.proceed();
System.out.println(System.currentTimeMillis());
return proceed;
}
可以设置事务在语句中进行
ProceedingJoinPoint pro代表设置的对象
Object用于设置返回值,记得类型的改变上面的void的类型也要改变
4、返回值后通知
@AfterReturning
用于有返回值后再给通知,保异常不给
5、报错后通知
@AfterThrowing
用于有报错后再进行通知,没有报错则不进行
六、AOP中获取参数和返回参数
1、AOP中获取类型和名字
@Pointcut("execution(* com.service.impl.userService.*(..))")
private void pd(){}
@Around("pd()")
public void method(ProceedingJoinPoint pro) throws Throwable {
long t1 = System.currentTimeMillis();
Signature signature = pro.getSignature();
Class declaringType = signature.getDeclaringTypeName().getClass();
String name = signature.getName();
for(int i=0;i<10000;i++)
pro.proceed();
long t2 = System.currentTimeMillis();
System.out.println("该"+declaringType+":"+name+"---------->"+"执行"+(t2-t1)+"ms");
}
Signature signature = pro.getSignature();为引用该类型
Class declaringType = signature.getDeclaringTypeName().getClass(); 获取类型名
String name = signature.getName();获取名字
2、获取参数值
@After("pd()")
public void method(JoinPoint jp){
Object[] args = jp.getArgs();
System.out.println("输入的值为:"+ Arrays.toString(args));
}
Arrays.toString(args)需要加这个进行转换
通过getArgs进行完成
3、将返回值进行改变
@Around("pd()")
public Object method(ProceedingJoinPoint pro) throws Throwable {
Object[] args = pro.getArgs();
System.out.println(Arrays.toString(args));
args[0] = 10;
Object proceeds = pro.proceed(args);
return proceeds;
}
重新设置过后通过proceed重新传回去
4、获取返回值数据
@AfterReturning(value = "pd()",returning = "i")
public void method(int i){
System.out.println("js:"+i);
}
有返回值后输出,可以自己设置类型
@AfterThrowing(value = "pd()",throwing = "jps")
public void method(Throwable jps){
System.out.println("异常:"+jps);
}
有异常的时候输出,可以在around中进行
如果这篇笔记帮你解决了某个困惑,不妨点个赞👍鼓励一下~
- 如何在电脑上下载与使用陌陌:完整指南你在学习文章相关的知识吗?本文《如何在电脑上下载与使用陌陌:完整指南》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就...
- 装一辆公路车要多久[导读]组装一辆公路自行车的过程可以根据个人的经验和技能水平有所不同。对于有经验的自行车爱好者或者专业人士来说,可能只需要几个小...
- 艾希成就总集及达成方法欢迎来到吉游戏!在#游戏攻略#栏目中,我们精心为您整理出了艾希成就总集及达成方法的最新详细图文攻略,帮助您轻松上手艾希。以下为您...
- 2017:回顾与展望十二月总结是一个神圣的传统。所以我们这就开始吧! 勒索软件 去年的这个时候,我们把2016年称为勒索软件之年,这一年确实出现了形式多样...
- 手机温控中枢:高通 Thermal Engine 框架分析1. 前言在当前移动处理芯片性能过剩的时代,用户对手机的温度要求越来越高,更加苛刻的标准,最好永不发热。在这种背景下,温控领域的工...
- 中国有嘻哈在哪里看?中国有嘻哈播放平台介绍爱奇艺7.0v14.10.5类型:影音视频 大小:103.82MB 评分:9.9 平台: 标签:在线直播电影在线视频短片玩机必备 立即下载 中国有嘻哈在哪里看?最近...
- 印度足球队进入世界杯吗〖印度进过世界杯吗〗不会吧!今天由我来给大家分享一些关于印度足球队进入世界杯吗〖印度进过世界杯吗〗方面的知识吧、 1、印度进过一次世界杯正赛。印度世...
- Nike Swoosh 护腕(1 对)¥59¥8933% 折让收藏Nike Swoosh 护腕(1 对)采用舒适面料,可随双手伸展并保持干爽,在比赛升温之际亦能助你成就出色表现。 显示颜色: 深夜蓝...
- 电脑电源线接法,建议对照说明书操作如果准备自己装机,或者选择了新的电脑电源之后准备自己动手更换电源,快来学一学电脑电源线接法,免得接错线损坏电脑,或者电源安装后...
- 竹的笔顺(笔画顺序)汉字竹的笔顺动画竹的笔顺 竹的笔顺动画演示 zhú 竹的笔顺规范 汉字竹一共有6画,字形结构是单一结构。 竹的字典释义 竹子,多年生常绿植物。茎圆柱形,有...