SpringAOP--aop使用
SpringAOP使用方式
切点表达式
常用的符号:
*:匹配任何数量字符;
..:匹配任何数量字符的重复,如在类型模式中匹配任何数量子包;而在方法参数模式中匹配任何数量参数。
+:匹配指定类型的子类型;仅能作为后缀放在类型模式后边。
一种常用的切点表达式如下:
(1):execution(* com.nuofankj.springdemo.aop.Service.(..))
(2):execution(* com.sample.service.impl..*.*(..))
(1)返回类型为任意类型,以Service开头的方法名,参数为任意参数;
(2)返回类型为任意类型,impl包及其子包(..)下的所有类的所有方法,任意参数类型;
基于切点表达式的使用方式
- 1 可以通过在切点中配置,拿到入参信息
//切点方法为:
@Override
public String saveUser(String user,Integer age) {
System.out.println("保存用户信息");
if (Objects.equals(user,"e")){
throw new RuntimeException();
}
return null;
}
/**切点配置为*/
//方式一:通过pointcut方法中定义参数,拿到切点处的参数
//通过Pointcut方法配置,拿到入参
@Pointcut(value = "execution(* com.wht.springaop.USerService.saveUser(..)) && args(cat,dog)")
public void pointcut2(String cat,Integer dog){
};
@Around("pointcut2(cat,dog)")
public Object aroundExe(ProceedingJoinPoint joinPoint,String cat,Integer dog) throws Throwable {
System.out.println("around1切面执行。。。");
try {
return joinPoint.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
throw throwable;
}finally {
System.out.println("around2切面执行。。。");
}
}
- 2 个人感觉最常用的还是这种,通过JoinPoint拿到入参信息
//通过JoinPoint拿到方法的入参信息
@After("execution(* com.wht.springaop.USerService.testNormalAop(..))")
public void AfterExe(JoinPoint point){
Object[] args = point.getArgs();
//参见JoinPoint的API介绍
System.out.println("切点获取传入的参数为:"+ Arrays.asList(args));
System.out.println("after:测试普通AOP方法");
}
- 3 另外可以通过自定义注解的方式使用,更加灵活
/**首先自定义注解*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Log {
String value() default "我是注解";
// int key();
}
/**在要切入的方法上使用此注解*/
@Log(value = "Log注解AOP")
@Override
public String testAnnotationAop(String name) {
System.out.println("测试注解AOP方法");
return "AOP注解方式";
}
/**配置切点,进行功能代码织入,同样有两种方式*/
//【1】表示切点在Log注解标识的方法上,这种将Log写入参数中的形式能直接拿到Log注解信息
@Pointcut(value = "@annotation(log)")
public void pointcut(Log log){
}
@Around(value = "pointcut(log)")
public Object get(ProceedingJoinPoint point,Log log) throws Throwable {
System.out.println(log.value());//能拿到注解的值
point.proceed();
System.out.println("Around02注解AOP");//环绕通知
return "123";
}
//【2】这种方式只能通过获取方法,然后获取方法上的注解的形式拿到,且@annotation需要配置注解的全限定名。
@Before(value = "@annotation(com.wht.springaop.Log)")
public void beforeExe(JoinPoint point){
MethodSignature signature = (MethodSignature) point.getSignature();
Method method = signature.getMethod();
//获取参数列表
String[] names = signature.getParameterNames();
//获取方法上的注解
Log log = method.getAnnotation(Log.class);
System.out.println("注解式拦截 " + log.value());
}
配置切面时,不要忘记将切面类SpringBoot启动时注入为Bean实例,同时标记为切面类。即使用注解:
@Aspect 和
@Component
JoinPoint切点的常用方法:
Signature getSignature(): 获取封装了署名信息的对象,在该对象中可以获取到目标方法名,所属类的Class等信息
Object[] getArgs(): 获取传入目标方法的参数对象
Object getTarget(): 获取被代理的对象
Object getThis(): 获取代理对象 `
SpringAOP--aop使用的更多相关文章
- springAop:Aop(Xml)配置,Aop注解配置,spring_Aop综合案例,Aop底层原理分析
知识点梳理 课堂讲义 0)回顾Spring体系结构 Spring的两个核心:IoC和AOP 1)AOP简介 1.1)OOP开发思路 OOP规定程序开发以类为模型,一切围绕对象进行,OOP中完成某个任务 ...
- springaop——AspectJ不可不知的细节
springaop简介 springaop是spring对AOP技术的具体实现,它是spring框架的核心技术.springaop底层使用JDK动态代理或CGLIB动态代理技术实现. 应用场景: 在多 ...
- Spring框架的基本使用(AOP部分)
AOP,Aspect Oriented Programming,意为面向切面编程,是通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP采取横向抽取机制,取代了传统纵向继承体系重复 ...
- 使用@AspectJ注解开发Spring AOP
一.实体类: Role public class Role { private int id; private String roleName; private String note; @Overr ...
- Spring的AOP原理
转自 https://www.tianmaying.com/tutorial/spring-aop AOP是什么? 软件工程有一个基本原则叫做“关注点分离”(Concern Separation),通 ...
- SpringMVC利用AOP实现自定义注解记录日志
作者:飞翔的拖鞋up 推荐:彻底征服 Spring AOP 之 实战篇 推荐:jason_zhangz 本文抛砖引玉,并没有详细的介绍更全面的内容,通过一个例子让初次使用的人能够快速入门,简单的介绍一 ...
- SpringAOP+RabbitMQ+WebSocket实战
背景 最近公司的客户要求,分配给员工的任务除了有微信通知外,还希望PC端的网页也能实时收到通知.管理员分配任务是在我们的系统A,而员工接受任务是在系统B.两个系统都是现在已投入使用的系统. 技术选型 ...
- JAVA spring 常用包作用
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- JAVA spring 常用包作用详解(转)
转载地址:https://www.cnblogs.com/Tmc-Blog/p/6093162.html <project xmlns="http://maven.apache.org ...
- Java高级工程师面试宝典
Java高级工程师面试宝典 JavaSE 多线程 进程与线程的区别? 答:进程是所有线程的集合,每一个线程是进程中的一条执行路径,线程只是一条执行路径. 为什么要用多线程? 答:提高程序效率 多线程创 ...
随机推荐
- 『德不孤』Pytest框架 — 7、Pytest预期失败
目录 1.@pytest.mark.xfail()标记的作用 2.应用场景 3.语法参数说明 4.示例 5.忽略xfail标识 Pytest预期失败需要使用@pytest.mark.xfail()标记 ...
- png图片隐写
- 使用已有流量进行RFC2544测试—信而泰网络测试仪实操
一.测试说明 先创建流量,将流量运行起来,流量正常.再使用创建的流量进行RFC2544测试,可以避免因为配置原因流量不通,影响RFC 2544测试. 而且创建流量的时候,可以编辑报文,例如增加TCP/ ...
- RFC2544丢包率测试——信而泰网络测试仪实操
文章关键词:RFC2544.丢包率.吞吐量. 丢包率概述: 丢包率(Frame Loss Rate)测试的目的是确定DUT在不同的负载和帧长度条件下的丢包率.在稳定负载下,由于网络设备资源缺乏,应该正 ...
- 『无为则无心』Python日志 — 65、日志模块logging的使用
目录 1.logger类用法 2.handler类用法 3.formatter类用法 4.filter类用法 1.logger类用法 logger类:logger用于提供日志接口,常用于配置和发送日志 ...
- Android系统编程入门系列之硬件交互——无线通信WLAN
Android系统的移动设备大多支持无线WLAN技术.利用该技术,不仅能实现互联网通信,还能实现无线定位,热点共享等远程通信功能.针对使用WLAN的不同功能,可能需要分别申请不同的权限声明,同时调用不 ...
- 正则表达式(三)——Java中的相关函数
1.前言 之前在学习Python时,我已经说过正则表达式的相关语法,这里不再赘述了,有需要可以参考: 2020.10.7 正则表达式(一) - ShineLe - 博客园 现在开始学习Java中的正则 ...
- Pycharm:设置完Anaconda后报错TypeError: an integer is required (got type bytes)
背景:安装了最新版本的Anaconda3.9后,在Pycharm中设置Python Interpreter为这个最新版本Anaconda文件下的python.exe后,控制台无法启动并报错TypeEr ...
- (六)目标检测算法之YOLO
系列文章链接: (一)目标检测概述 https://www.cnblogs.com/kongweisi/p/10894415.html (二)目标检测算法之R-CNN https://www.cnbl ...
- 将ISO镜像文件制作成USB disk
制作USB Live盘有Universal USB Installer.UNetbootin.WinSetupFromUSB.LinuxLive USB Creator.YUMI(Your Unive ...