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 多线程 进程与线程的区别? 答:进程是所有线程的集合,每一个线程是进程中的一条执行路径,线程只是一条执行路径. 为什么要用多线程? 答:提高程序效率 多线程创 ...
随机推荐
- VS Code开发TypeScript
TypeScript是JaveScript的超集,为JavaScript增加了很多特性,它可以编译成纯JavaScript在浏览器上运行.TypeScript已经成为各种流行框架和前端应用开发的首选. ...
- 【测试必备】k8s基本使用(更新中。。。)
测试为什么要学习容器技术及k8s k8s不是运维的专属技术 随着互联网技术的发展,架构也已经从单体架构发展到容器云( "微服务 + k8s" 完美结合) 很多人认为,k8s只是运维 ...
- 【性能测试实战:jmeter+k8s+微服务+skywalking+efk】系列之:性能监控、分析、调优等
说明: 本文是基于虚拟机演示的,资源有限 skywalking中拓扑图 kubectl get po -A -owide 测试执行:单场景 查询礼品 jmeter -n -t gift.jmx -l ...
- kali linux中ifconfig命令不能使用的解决办法
1.安装net-tools,因ifconfig属于net-tools,输入命令: sudo apt-get install net-tools 记住加上sudo哦!4647c21ef50df33a ...
- 图片隐写之Image Steganography软件的使用
CTF_论剑场 MISC 坏掉的图像 writeup 把图片丢进winhex里,发现头部的 0D 1A 0A 1A是不正确的,正确的应该为 0D 0A 1A 0A,所以需要更改. 更改完成后打开图片可 ...
- IP网络性能测试工具——Renix Perf
一.Renix Perf 基于软件的网络及应用服务性能测试工具 · 双臂测试 · 单臂测试 通过测试端点产生网络流量对网络性能进行测量 · TCP.UDP.PING · 语音.视频.HTTP.FTP. ...
- Java 实现Https访问工具类 跳过ssl证书验证
不多BB ,代码直接粘贴可用 import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.F ...
- omnet++:官方文档翻译总结(一)
1.什么是omnet++ 翻译总结自:What is OMNeT++? omnet++是用来进行网络仿真的C++库和框架.这里的网络包括有线.无线.on-chip.queueing网络等等.特定领域中 ...
- 系统整理qt笔记3
qtcreator中不能输入中文: https://blog.csdn.net/qq_15725099/article/details/97305507 main.cpp #include " ...
- k8s线上某些特殊情况强制删除 StatefulSet 的 Pod 要考虑什么隐患?
k8s线上某些特殊情况强制删除 StatefulSet 的 Pod 要考虑什么隐患? 考点之什么情况下,需要强制删除 StatefulSet 的 Pod? 考点之如果 StatefulSet 操作不当 ...