当前位置: 首页 > 知识库问答 >
问题:

在API(接口)方法中使用带@Annotation的AOP调用方法拦截器

戚建华
2023-03-14

希望在点切表达式中使用@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" />
  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(TestVoTestVo)方法使用@TestDocument(test=“test”)自定义注释,仅在如下所示的接口中(不在上面的实现类中,我们不想在实现类中注释方法)。在这种情况下,它不会截获通知类,因此不会从上面的AfterAdvisor类中打印“AfterAdvisor:AfterMethod Invocation!”。

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

岳正阳
2023-03-14

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

  1. 将TestService接口更改为抽象基类,并将@inherited添加到注释定义中
  2. 更改切入点以应用于TestService:execution(public*com.xxx.testService+.*(..))
 类似资料:
  • 我正在使用spring AOP拦截这些方法。我在spring配置文件中有以下配置。 方面类: 上面的方法不拦截私有方法?要求方面既拦截私有方法,又拦截公有方法,怎么办?

  • 问题内容: 我有这个代码 有什么方法可以在没有子类化或修改类且没有工厂的情况下拦截呼叫? 编辑:抱歉忘了提到这是在Android平台上。 问题答案: 您是否考虑过面向方面的编程,甚至还考虑过AspectJ?有关AspectJ / Android的信息,请参见此处和此处。

  • 问题内容: 我正在用python实现RESTful Web服务,并想通过拦截函数调用并记录其执行时间等方式来添加一些QOS记录功能。 基本上,我想到了所有其他服务都可以从中继承的类,该类会自动覆盖默认方法的实现,并将其包装在logger函数中。实现此目标的最佳方法是什么? 问题答案: 像这样吗 这暗示着在您的方法中添加装饰器(如果您愿意,也可以基于此创建一个显式装饰器): 当您现在尝试类似的方法:

  • 让我们有一个简单的界面: 现在我这样创建代理: 当我执行测试时,我看到以下输出: 似乎我永远无法访问被调用方法的方法签名,如果它起源于接口,并且不是由超类实现的?! 当我调用我会看到,它也接受所有输入参数。 我错过了什么?我看了留档,但我仍然很困惑。 一般来说,我想创建,它捕获代理类中的所有方法,并处理以下情况: 执行一些操作,然后将调用传播到原始方法 做某事并返回它自己的结果,而不调用原始meh

  • 问题内容: 我正在使用Java EE 6和Jboss AS7.1,并尝试使用拦截器绑定(来自jboss网站的示例)。 我有一个InterceptorBinding注解: 拦截器: 还有一个豆: 但是拦截器没有被称为。。。 在编写此代码时将调用拦截器: 谢谢你的帮助。 问题答案: 您是否按照参考示例中的说明启用了拦截器? 缺省情况下,bean档案没有通过拦截器绑定绑定的已启用拦截器。必须通过将侦听器

  • 所以我有一个自定义注释 我想使用它将方面编织到方法中(AspectJ,<代码>@注释(截取) )。 其思想是,当我直接注释方法截取时,我将方面编织入其中——这一部分起作用——或者如果我注释类,则应将方面编织入其所有(公共)方法中——这一部分不起作用。 此外,如果我对一个类及其一个方法进行注释,则方面应该只被编织一次,方法级注释将覆盖类级注释。 本质上,我想要一个“如果有类级注释,但只有在还没有方法