AOP切面操作
package com.hxkr.util; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; /** * AOP的一些相关概念 切面(Aspect):是切入点和通知的结合; 连接点(Joinpoint):类里面可以被增强的方法,这些方法称为连接点; 增强处理(Advice):指拦截到Joinpoint之后所要做的事情就是通知. 通知分为前置通知(@Before),后置通知(@After),异常通知(@AfterThrowing),最终通知(@AfterReturning),环绕通知(切面要完成的功能)(@Around); 切入点(Pointcut):指我们要对哪些Joinpoint进行拦截的定义 * */ @Aspect @Component public class LogInterceptor { /** * 使用方法:springboot为例 * 第一步:引入AOP依赖 * <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> 第二步:使用@Aspect和@Component注解将一个java类定义为切面类 第三步:使用@Pointcut定义一个切入点(定义在哪个方法里使用) 第四步:根据需要在切入点不同位置的切入内容 使用@Before在切入点开始处切入内容 使用@After在切入点结尾处切入内容 使用@AfterReturning在切入点return内容之后切入内容(可以用来对处理返回值做一些加工处理) 使用@Around在切入点前后切入内容,并自己控制何时执行切入点自身的内容 使用@AfterThrowing用来处理当切入内容部分抛出异常之后的处理逻辑 * */ /* 定义一个切入点 */ /** * AspectJ语法 "execution(* cn.youyinian.controller.v1.*.*(..))" 指定在执行 cn.youyinian.controller.v1 包中任意类的任意方法之前执行方法增强; 第一个星号表示返回值不限; 第二个星号表示类名不限; 第三个星号表示方法名不限; 圆括号中的 .. 表示任意个数、类型不限的形参。 */ @Pointcut("execution(* com.hxkr.service.*.*(..))") private void log() { } /** * 切入点之前的操作 */ @Before("log()") /** * 在切入点前的操作,按order的值由小到大执行 * 在切入点后的操作,按order的值由大到小执行 */ @Order(2) private void before() { System.out.println("[定时任务] >>>>>>>>>>>>>>>>>>> 开始"); } @Before("log()") @Order(1) private void after() { System.out.println("[定时任务] >>>>>>>>>>>>>>>>>>> 结束"); } }