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

サブスクリプションサブスクリプション=newSubscription();

Subscription.setStatus(1);

サブスクリプションは、適用されるアスペクトのスプリング管理されたBeanである必要があります。つまり、次のようにタイプSubscriptionのオブジェクトを取得する必要があります。ApplicationContext

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

@Resourceまたは、@Autowired注釈を使用してそれらを注入します。

次に、setStatus()onsubscriptionオブジェクトの呼び出しは、Springフレームワークによって作成されたAOPプロキシを通過し、メソッド定義に一致するAOPアドバイスのコードが実行されます。

new演算子を使用してオブジェクトを作成しながら、スプリング管理されたBeanを取得する別の方法は、@Configurableアノテーションを使用することです。

于 2012-10-20T07:58:25.473 に答える