在API(接口)方法

时间:2015-12-06 19:01:17

标签: spring annotations spring-aop

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

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

请建议。

示例代码: 建议类

   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是分别具有常用方法addTest(TestVO testVo)的接口和实现类,如图所示

现在2例:

1.addTest(TestVO testVo)方法在接口和实现类中使用@TestDocument(test =“test”))自定义注释进行注释,如下所示。在这种情况下,它拦截了建议类打印“AfterAdvisor:after方法调用!“来自上面的AfterAdvisor类作为切割表达式=“@ annotation(com.xxx.annotation.TestDocument)用于拦截任何使用@TestDocument注释的方法。

接口和实现类(这两个方法都使用@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”)注释,接口中的自定义注释仅在下面显示(不是在上面的实现类中,我们不想在实现类中注释该方法) )。 在这种情况下,它不会拦截建议类,因此不会打印“AfterAdvisor:方法调用后!”来自上面的AfterAdvisor课程。

接口和实现类(只有接口方法用@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;
   }

1 个答案:

答案 0 :(得分:0)

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

  1. 将TestService接口更改为抽象基类,并将@Inhertied添加到注释定义
  2. 更改您的切入点以应用于TestService的所有子图块/实现:执行(public * com.xxx.TestService +。*(..))