Java Spring AspectJ风格AOP

Java Spring AspectJ风格AOP,java,spring,aop,aspectj,Java,Spring,Aop,Aspectj,我有一个使用Spring的Java应用程序,我有这个方面 @Aspect public class MyAspect { @Pointcut("execution (* com.mycompany.MyClass.*(..))") public void doStuff() {} @Around("doStuff()") public Object aroundDoStuff(ProceedingJoinPoint pjp) throws Throwable

我有一个使用Spring的Java应用程序,我有这个方面

@Aspect
public class MyAspect
{

    @Pointcut("execution (* com.mycompany.MyClass.*(..))")
    public void doStuff() {}

    @Around("doStuff()")
    public Object aroundDoStuff(ProceedingJoinPoint pjp) throws Throwable
    {
        System.out.println("before doStuff);
      try
      {
        return pjp.proceed();
      }
      finally
      {
        System.out.println("after doStuff");
      }
  }
}
然后我的springbean文件

<aop:aspectj-autoproxy proxy-target-class="true" />
<bean id="MyAspect"
    class="com.mycompany.MyAspect" />
谢谢,
Jeff

您的类路径中可能没有cglib,这是因为当您指定proxy target class=true时,将创建基于cglib的代理,而不是默认的基于java动态代理的代理。您可以尝试在路径中使用CGLIB,或者删除代理目标类属性(假设您的bean确实有一个动态代理工作所需的接口)


编辑1:我尝试了您的样本,并将其放在github的以下位置-git://github.com/bijukunjummen/mvc-samples.git,您可以使用-
mvn test-Dtest=TestSpringAOP
执行测试,该测试将测试您的场景,并且似乎运行良好。您能回顾一下这个测试,看看它与您的案例有多大的不同。

结果表明问题是因为我代理了一个类而不是一个接口。我需要更改切入点以匹配实现接口的所有类,然后使用
target
切入点向下筛选MyClass

编辑:正在添加详细信息

如果MyClass扩展AbstractMyClass并实现MyInterface,我希望MyInterface中的所有方法都得到建议,但事实并非如此。我错误地将我的切入点声明为:

@Pointcut(execution(* com.mycompany.MyClass.methodInAbstract()))
改成

@Pointcut(execution(* com.mycompany.MyInterface.methodInAbstract()) && target(com.mycompany.MyClass))

很好。

你能给我们看看主课吗?它是否在内部调用方法(我的意思是,MainClass的一个方法调用同一实例的另一个方法)?我已经从main.Is
doSomething()
public non final添加了一个相关的代码片段?是的。虽然在我的实际生产代码中,doSomething确实重写了受保护的超类中的方法(但我的类将其公开)。代理实际上正在创建,但建议似乎没有执行(加载对象时,我打印了对象的类,它是一个CGLIB类)。@Jeff你有没有尝试过我在编辑中添加的这个示例-git://github.com/bijukunjummen/mvc-samples.gitBiju,谢谢跟进。问题是,当我的切入点指定了一个类类型的目标时,即@pointcut(execution(*com.mycompany.MyClass)),如果该方法是由MyClass的父类实现的,它不会建议MyClass接口中的方法。我将编辑我的答案以显示详细信息。
@Pointcut(execution(* com.mycompany.MyInterface.methodInAbstract()) && target(com.mycompany.MyClass))