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使用的更多相关文章

  1. springAop:Aop(Xml)配置,Aop注解配置,spring_Aop综合案例,Aop底层原理分析

    知识点梳理 课堂讲义 0)回顾Spring体系结构 Spring的两个核心:IoC和AOP 1)AOP简介 1.1)OOP开发思路 OOP规定程序开发以类为模型,一切围绕对象进行,OOP中完成某个任务 ...

  2. springaop——AspectJ不可不知的细节

    springaop简介 springaop是spring对AOP技术的具体实现,它是spring框架的核心技术.springaop底层使用JDK动态代理或CGLIB动态代理技术实现. 应用场景: 在多 ...

  3. Spring框架的基本使用(AOP部分)

    AOP,Aspect Oriented Programming,意为面向切面编程,是通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP采取横向抽取机制,取代了传统纵向继承体系重复 ...

  4. 使用@AspectJ注解开发Spring AOP

    一.实体类: Role public class Role { private int id; private String roleName; private String note; @Overr ...

  5. Spring的AOP原理

    转自 https://www.tianmaying.com/tutorial/spring-aop AOP是什么? 软件工程有一个基本原则叫做“关注点分离”(Concern Separation),通 ...

  6. SpringMVC利用AOP实现自定义注解记录日志

    作者:飞翔的拖鞋up 推荐:彻底征服 Spring AOP 之 实战篇 推荐:jason_zhangz 本文抛砖引玉,并没有详细的介绍更全面的内容,通过一个例子让初次使用的人能够快速入门,简单的介绍一 ...

  7. SpringAOP+RabbitMQ+WebSocket实战

    背景 最近公司的客户要求,分配给员工的任务除了有微信通知外,还希望PC端的网页也能实时收到通知.管理员分配任务是在我们的系统A,而员工接受任务是在系统B.两个系统都是现在已投入使用的系统. 技术选型 ...

  8. JAVA spring 常用包作用

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  9. JAVA spring 常用包作用详解(转)

    转载地址:https://www.cnblogs.com/Tmc-Blog/p/6093162.html <project xmlns="http://maven.apache.org ...

  10. Java高级工程师面试宝典

    Java高级工程师面试宝典 JavaSE 多线程 进程与线程的区别? 答:进程是所有线程的集合,每一个线程是进程中的一条执行路径,线程只是一条执行路径. 为什么要用多线程? 答:提高程序效率 多线程创 ...

随机推荐

  1. tip2:Linux系统相关命令使用

    好记忆不如烂笔头,很多东西不常用突然要用就是记得相关的命令但是具体就不确定了,本文记录个人不常用同时偶尔用到但不确定或者记不住的内容. 一.用户管理 这组个人使用频率不高,知道同时记不住具体涉及的系统 ...

  2. 解决UIWebView内存不释放问题

    走访很多朋友,查阅了很多资料发现UIWebView这尼玛就是个坑,有人说是sdk自带的bug....... 所以一个新的方法诞生了#import <WebKit/WebKit.h> WKW ...

  3. kali linux 静态地址和动态地址的设置

    在文件系统里找到/etc/network下的interfaces文件,打开后可以看到eth0为dhcp,将其修改为# This file describes the network interface ...

  4. ctf平台

    CTF靶场 蓝鲸安全:http://whalectf.xin bugku:https://ctf.bugku.com XCTF攻防世界:https://adworld.xctf.org.cn/ i春秋 ...

  5. WPS:想让一个新标题后总跟着一种特定样式的文字

    只需在这个后续段落样式中修改为你想要的那个样式即可

  6. LeetCode-016-最接近的三数之和

    最接近的三数之和 题目描述:给定一个包括 n 个整数的数组 nums 和 一个目标值 target.找出 nums 中的三个整数,使得它们的和与 target 最接近.返回这三个数的和.假定每组输入只 ...

  7. LeetCode-023-合并K个升序链表

    合并K个升序链表 题目描述:给你一个链表数组,每个链表都已经按升序排列. 请你将所有链表合并到一个升序链表中,返回合并后的链表. 示例说明请见LeetCode官网. 来源:力扣(LeetCode) 链 ...

  8. Angular + Github action + Nginx 部署

    在常规 Web 的开发流程之中,当开发步入尾声时就需要部署应用到服务器上,Angular 部署上还算简单.经过测试,部署平均用时在5分钟左右,主要受限于 GitHub 海外服务器的网速. 一.Angu ...

  9. laravel 怎么获取public路径

    app_path()   app_path函数返回app目录的绝对路径: $path = app_path();   你还可以使用app_path函数为相对于app目录的给定文件生成绝对路径: $pa ...

  10. Python 从底层结构聊 Beautiful Soup 4(内置豆瓣最新电影排行榜爬取案例)

    1. 前言 什么是 Beautiful Soup 4 ? Beautiful Soup 4(简称 BS4,后面的 4 表示最新版本)是一个 Python 第三方库,具有解析 HTML 页面的功能,爬虫 ...