4

我试图在方法注释上创建一个 Aspectj 切入点,但我一直以不同的方法失败。我正在使用 aspectj autoproxy(我没有在我的 spring 上下文中配置其他编织)。我的课程如下所示:

public interface Intf
{
  @SomeAnnotation
  void method1() throws SomeExc;
}

public class Impl implements Intf
{
  @Override
  public void method1() throws SomeExc
  {
    //...
  }
}

@Aspect
public class MyAspect
{
  @AfterThrowing(
    pointcut = "execution(* *(..)) && @annotation(SomeAnnotation)",
    throwing = "error")
  public void afterThrowing(JoinPoint jp, Throwable error)
  {
    System.err.println(error.getMessage());
  }
}

@Component
public class Usage
{
  @Autowired
  Intf intf;

  public void doStuff()
  {
    intf.method1();
  }
}

所以我想知道为什么aspectj不会创建切入点。我设法使用execution(* *(..) throws SomeExc)which 为我完成了这项工作,但我仍然想知道我做错了什么。

另外,由于method1是在接口中定义的,并且我在实现类上指定了注释,有没有办法让它以这种方式工作?其他代理机制(如事务管理/安全性)在 Spring 的其他部分以这种方式工作,对吗?如果我使用接口代理,是否会在实现类上指定切入点来创建切入点?(我猜不是,因为我没有使用 cglib)

4

2 回答 2

3

尝试将@Component 添加到 MyAspect 类

@Component
@Aspect
public class MyAspect {
...
于 2013-02-19T09:03:12.000 回答
3

只需将您的方面方法标记为

@After("@annotation(package.SomeAnnotation)")

看一下这个一步一步的指南

于 2013-07-01T08:04:43.683 回答