首先我们要引入对应的aspectj的对应依赖
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.7</version> </dependency>
这里已经默认你创建好了你的对应 切面类以及切点和对应的通知方式
下面是常用的execution表达式
1)execution(* *(..)) //表示匹配所有方法 2)execution(public * com.controller.UserController.*(..)) //表示匹配com.controller.UserController类或接口中所有的公有方法 3)execution(* com.controller..*.*(..)) //表示匹配com.savage.server包及其子包下的所有方法,4大权限修饰符 //public,protected,private,default 4)execution(* get*(..)) //表示以 get开始的方法 5)execution(* com.controller.*.*(..)) //controller包下的任何的方法 6)execution(* com.controller..*.*(..)) //controller包下以及子包下的任何的方法
此时我们可以来做一个简单的小demo进行演示
首先我们需要创造一个切面类
@Aspect @Component public class Advice { @Around("execution(public * com.example.aopdemo.demos.web.BasicController.*(..)) ") public Object around(ProceedingJoinPoint pjp) throws Throwable{ System.out.println("在执行之前做点什么"); Object proceed = pjp.proceed(); System.out.println("在执行之后做点什么"); return proceed; } }
这里可以简单说明下:
- 命名规范:一般对于切面类而言会以Aspect结尾
- 这个切面类需要被spring所管理
- execution需要路径正确,否则启动会报错
- ProceedingJoinPoint是切点对象,是aspectj封装的,执行切点方法需要我们主动调用proceed()方法
启动运行测试一下:
对应controller:
@RequestMapping("/hello") @ResponseBody public String hello(@RequestParam(name = "name", defaultValue = "unknown user") String name) { System.out.println("我被执行了"); return "Hello " + name; }
对应控制台输出
2024-10-13 18:23:44.255 INFO 4308 --- [)-192.168.31.26] CoolRequest Method Call : call:com.example.aopdemo.demos.web.BasicController.hello 2024-10-13 18:23:44.255 INFO 4308 --- [)-192.168.31.26] CoolRequest Method Call : args:{0=caiyi} 在执行之前做点什么 我被执行了 在执行之后做点什么