背景
AOP,面向切面编程,理念深入人心,使用范围也很广。
在日常开发中,我们经常用Spring AOP实现一些横向功能复用,比如下列场景
-
方法或外部接口调用增加入参出参及耗时日志
-
拦截方法调用增加本地或远端分发
-
接口增加鉴权或限流逻辑
大部分情况下,我们实现AOP功能时,切点通常采用@Pointcut注解描述,采用execution表达式形式如@Pointcut("execution(* cn.biz.abc.xyzClass.methodA(..))")
。这种实现方式有没有什么缺点呢?
缺点
execution表达式形式有2个缺点,
- 切点表达式写死,与织入逻辑有些耦合。新增切点需要修改表达式或者让方法签名满足表达式要求。
- 切入点代码与织入逻辑代码无法在IDE中关联,不容易找到代码入口,不利于代码维护。
解决方法
使用自定义注解标记要切入的方法。
对应的Pointcut注解采用@target、@within、@annotation等表达式形式。
而且,Spring的事务注解@Transaction、异步注解@Async等都是采用注解形式。
好处
-
切点和织入逻辑不耦合。哪里要aop,哪里就加注解,很灵活。
-
注解让切点有明确的标记,方便维护人员理解代码。