SpringAop注解概述
@Aspect 切面声明,标注在类、接口(包括注解类型)或枚举上。
@Pointcut
切入点声明,即切入到哪些目标类的目标方法。
value 属性指定切入点表达式,默认为 "",用于被通知注解引用,这样通知注解只需要关联此切入点声明即可,无需再重复写切入点表达式
@Before
前置通知, 在目标方法(切入点)执行之前执行。
value 属性绑定通知的切入点表达式,可以关联切入点声明,也可以直接设置切入点表达式
注意:如果在此回调方法中抛出异常,则目标方法不会再执行,会继续执行后置通知 -> 异常通知。
@After 后置通知, 在目标方法(切入点)执行之后执行
@AfterReturning
返回通知, 在目标方法(切入点)返回结果之后执行,在 @After 的后面执行
pointcut 属性绑定通知的切入点表达式,优先级高于 value,默认为 ""
@AfterThrowing
异常通知, 在方法抛出异常之后执行, 意味着跳过返回通知
pointcut 属性绑定通知的切入点表达式,优先级高于 value,默认为 ""
注意:如果目标方法自己 try-catch 了异常,而没有继续往外抛,则不会进入此回调函数
@Around
环绕通知:目标方法执行前后分别执行一些代码,类似拦截器,可以控制目标方法是否继续执行。
通常用于统计方法耗时,参数校验等等操作。
环绕通知早于前置通知,晚于返回通知。
定义一个注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AspectJS {
}
定义切面
@Component
@Aspect
public class AspecJPointCut {
@Pointcut("@annotation(com.sz.config.AspectJS)")
public void pointcut(){}
@Before("pointcut()")
public void before(){
System.out.println("before 之前");
}
@After("pointcut()")
public void After(){
System.out.println("after 之后");
}
}
用法
import com.sz.config.AspectJS;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class StudyController {
@RequestMapping("/test")
@AspectJS
public void test(){
System.out.println("test 方法");
}
}
其中
@Pointcut("@annotation(com.sz.config.AspectJS)")
表示只要是在类或者方法上加上@AspectJS这个注解,那么就会被拦截执行切面