开发者

Spring AspectJ Style AOP

开发者 https://www.devze.com 2023-02-17 13:47 出处:网络
I have a Java app that uses Spring, and I have the aspect @Aspect public class MyAspect { @Pointcut(\"execution (* com.mycompany.MyClass.*(..))\")

I have a Java app that uses Spring, and I have the aspect

@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");
      }
  }
}

Then my spring bean file has

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

Now I would expect that all methods in MyClass get matched by the pointcut above, but that doesn't seem to be开发者_如何学Python the case (only one of the methods seems to have the advice applied). I'm not sure if this has to do with the fact that I'm proxying a class or not, but does anyone see what I might be doing wrong here?

EDIT: The code is called from a main class that does something like this:

ApplicationContext cxt; // lookup the cxt
MyClass mc = (MyClass) cxt.getBean("MyClassBean");
mc.doSomething(); // I expect the advice to be applied here.

thanks, Jeff


It turned out the issue is because I was proxying a class and not an interface. I needed to change the pointcut to match all of the classes that implemented the interface and then used the target pointcut to filter down to MyClass.

Edit: Adding details...

If MyClass extends AbstractMyClass and implements MyInterface, I wanted all methods in MyInterface to be advised, but this was not the case. I incorrectly declared my pointcut as:

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

Changing it to

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

worked well.


You probably don't have cglib in your CLASSPATH, this is because when you specify the proxy-target-class=true, a CGLIB based proxy is created, rather than the default java dynamic proxy based one. Can you try with CGLIB in the path or by removing the proxy-target-class attribute(assuming that your bean does have an interface which is needed for dynamic proxy to work).

EDIT 1: I tried your sample, and have put it in github at this location - git://github.com/bijukunjummen/mvc-samples.git, you can execute the test which exercises your scenario using - mvn test -Dtest=TestSpringAOP and it seems to work well. Can you please review this test and see how different it is from your case.

0

精彩评论

暂无评论...
验证码 换一张
取 消