2

切入点工作得create()很好,但我无法让setStatus()切入点工作,但我尝试......我已经尝试过@Before, @After, @AfterReturning,但没有。

根据调试器,这两种方法都被调用。

package com.baz;

@Aspect
public class ServiceAspect {
   @Pointcut("execution(* com.foo.ServiceImpl.create(..))")
    public void create() {}

    @Pointcut("execution(* com.bar.Subscription.setStatus(..))")
    public void setStatus() {}

    // works
    @AfterReturning(pointcut="create()", returning="retVal")
    public void afterCreate(Object retVal) {
        // omitted
    }

    // doesn't work
    @Before("setStatus()")
    public void status() {
        // omitted
    }

    // doesn't work
    @Before("setStatus() && args(status)")
    public void status(int status) {
        // omitted
    }

    // doesn't work
    @After("setStatus()")
    public void status() {
        // omitted
    }

    // doesn't work
    @AfterReturning(pointcut="setStatus()")
    public void status2() {
        // omitted
    }

    // doesn't work
    @AfterReturning(pointcut="setStatus()", returning="retVal")
    public void afterSetStatus(Object retVal) {
        // omitted
    }

    // doesn't work
    @Around("setStatus()")
    public Object aroundStatus(ProceedingJoinPoint pjp) throws Throwable {
        Object output = pjp.proceed();
        return output;
    }
}

这些方法如下所示:

public class Subscription extends FooBar implements Baz {
    public void setStatus(int status) { /* ... */ }
}

public class ServiceImpl implements Service {
    public Subscription create(Session session, Subscription template) { /* ... */ }
}

编辑

我试过同时使用<aop:aspectj-autoproxy />,<aop:aspectj-autoproxy proxy-target-class="true"/><aop:aspectj-autoproxy proxy-target-class="false"/>.

编辑 2

我试过setStatus()直接打电话Subscription,但也没有。

Subscription subscription = new Subscription();
subscription.setStatus(1);
4

1 回答 1

2

订阅订阅 = 新订阅();

订阅.setStatus(1);

对于要应用的方面,订阅应该是一个弹簧管理的 bean,即您应该SubscriptionApplicationContext以下获取类型的对象:

ClassPathXmlApplicationContext context = 
    new ClassPathXmlApplicationContext("classpath:META-INF/Spring.xml");
Subscription subscription = context.getBean(Subscription.class);

@Resource或使用或@Autowired注释将它们注入。

然后,对setStatus()onsubscription对象的调用将通过 Spring 框架创建的 AOP 代理,并执行与方法定义匹配的 AOP 通知中的代码。

在使用运算符创建对象时,获取 spring 管理的 bean 的另一种方法new是使用@Configurable注解。

于 2012-10-20T07:58:25.473 回答