在 API(interface) 方法中使用带有@annotation 的AOP 调用方法拦截器

Invoking method interceptor using AOP with @annotation in API(interface) method

想在切入点表达式中使用@annotation 拦截使用自定义注解(在本例中为@TestDocument)注解的方法。

当接口和实现方法都使用自定义注释进行注释时,它可以工作。(但期望通过仅注释接口方法来工作,假设它是 possible.please 正确的,如果不是这样的话)。

求推荐。

示例代码: 建议class

   public class AfterAdvisor  implements AfterReturningAdvice {
   public void afterReturning(Object returnValue, Method method,Object[] args, Object target)  {

          System.out.println("AfterAdvisor : after method invocation!");

}

自定义注释:

@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
 public @interface TestDocument {
 string test default "";
  }

配置详情:

    <aop:config>
          <aop:pointcut id="addPointcut" expression="@annotation(com.xxx.annotation.TestDocument)" />
          <aop:advisor pointcut-ref="addPointcut" advice-ref="afterAdvisor" order="1" />
   </aop:config>
 <bean id="afterAdvisor"     class="com.xxx.AfterAdvisor" />

Testservice和TestServiceImpl是接口和实现class分别有公共方法addTest(TestVO testVo)如图

现在2例:

1.addTest(TestVO testVo) 方法在接口和实现中都使用@TestDocument (test="test")) 自定义注释进行注释 class 如图所示 below.In this如果它正在拦截来自 AfterAdvisor class 的建议 class 打印 "AfterAdvisor : after method invocation!",因为切点表达式 =“@annotation(com.xxx.annotation.TestDocument) 用于拦截任何注释的方法@TestDocument.

接口和实现class(两个方法都用@TestDocument注解):

  public interface TestService{
   @TestDocument (test="test"))
   public  testVO addTest(TestVO testVo) ;
      }
   public class TestServiceImpl implements TestService{
   @TestDocument (test="test"))
    public  testVO addTest(TestVO testVo) {
          //do something
          return testVo;
   }

但是下面这个案例不起作用,如果可能的话,预计会起作用。

2.addTest(TestVO testVo) 方法用@TestDocument (test="test")) 接口中的自定义注释仅显示如下(在实现中未如上所示class,我们不想在实现中注释方法 class)。 在这种情况下,它不会拦截建议 class,因此不会从上面的 AfterAdvisor class 打印 "AfterAdvisor : after method invocation!"。

接口与实现class(只有接口方法用@TestDocument注解):

  public interface TestService{
   @TestDocument (test="test"))
   public  testVO addTest(TestVO testVo) ;
      }

   public class TestServiceImpl implements TestService{
    public  testVO addTest(TestVO testVo) {
          //do something
          return testVo;
   }

我觉得做不到。在 Java 中,注释不是从接口继承的。可以做的是:

  1. 将 TestService 接口更改为抽象基础 class 并将 @Inhertied 添加到您的注释定义中
  2. 更改要应用于所有 sublcasses/implementations TestService 的切入点:execution(public * com.xxx.TestService+.*(..))