业务场景
使用aop时需要编写切入点表达式来进行方法定位。
当在编写过程中代理需求频繁变化导致目标对象频繁变化时,就需要重新编写表达式。
如果能在aop操作编写完成的情况下,利用注解进行定位的话,无论后期需求怎么修改,都只需要在编写时顺手在需要代理的位置添加或删除注解即可。
前置技能
- AOP编程方法;
- 自定义注解;
- Java反射。
例子
- 首先编写我们的切面类AspectDemo:
@Aspect
@Component
public class AspectDemo {
/**
* 定义切点
*/
@Pointcut("/**待编写**/")
private void point() {
}
/**
* 计时
*
* @param proceedingJoinPoint 运行态连接点
*/
@Around("logPoint()")
private Object access(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
/**前置操作**/
Object res = proceedingJoinPoint.proceed(); // 运行
/**后置操作**/
return res;
}
}
- 自定义注解。可以自己选择是否需要参数,以便在切面方法中让用户自定义一些操作。
这里需要注意的是,必须要添加“@Retention(RetentionPolicy.RUNTIME)”,否则注解类不参与编译,在后续使用该注解类的地方就会抛异常;
@Target中声明注解修饰目标,这里选择了类和方法;
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AnnotationDemo {
}
- 在PointCut中补全表达式如下,表达式中可以使用“&&”、“||”等逻辑运算符,@annotation匹配对应注解参数修饰的方法,@within匹配对应注解参数修饰的具体类:
@Pointcut("@annotation(InBucket) || @within(InBucket)")
(完整的切入点语法 自行百度 参考别处)