在做完项目后决定在巩固一下aop的知识点。
从注释写起吧。
@Aspect 声明创建一个切面类
@Around,@Before,@After :分别为环绕通知,前置通知和后置通知 。
@Around此注解标注的通知方法在目标方法前后都被执行。
代码如下:
@Around("rolePointCut()") public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable { //目标对象调用的切入点方法 Object result = pjp.proceed(); return result; }
在执行pjp.proceed()方法前后都可以增加代码来完善功能,@Before就是在执行被切方法前执行,@After就是在执行被切方法后执行,ProceedingJoinPoint pjp,这个对象@Before和@After用不着,只有@Around用。
那么在刚才代码中@Around("rolePointCut()"),rolePointCut()是干嘛的呢?
这个叫做切入点表达式被绑定的方法(随便起名字即可)。我们先讲切入点@Pointcut。里面需要绑定切入点表达式。通常有两种方式,execution()方法的签名来匹配。格式如:execution(访问修饰符? 返回值 包名.类名.? 方法名(方法参数) throws 异常?)。带?表示可以省略掉的部分:访问修饰符,包名.类名,throws异常。第二种:annotation借助自定义注解。
首先自定义注解:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyLog {
}
然后在切面类通知中引用
@Pointcut("@annotation(com.briup.anno.MyLog)")
private void pc() {}
在业务类上添加注解可使用。
一般来说过程是这样:先定义@Aspect和@Component两个组件声明切面类。之后定义切入点表达式被绑定的方法(方法名随意)重要的是@Pointcut这个切入点,绑定好切入点表达式之后,在下面写通知方法和切面,即@Around(切入点表达式被绑定的方法)下面写切面内容即可。