2012-10-19 111 views
1

create()切入點工作得很好,但我不能得到,但是我嘗試setStatus()切入點工作...我試着@Before@After@AfterReturning,但一無所獲。很簡單的Spring AOP切點

根據調試器,調用這兩種方法。

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); 
+0

'com.bar'是'setStatus'切入點的正確包名嗎? –

+0

@ nicholas.hauschild是的,否則在初始化過程中會得到RuntimeException – Oscar

+0

您是否嘗試直接在Subscription類型的對象上調用'setStatus()'方法並查看是否調用了@ @ Before'建議? – Vikdor

回答

2

訂閱訂閱=新訂閱();

subscription.setStatus(1);

認購應該是一個Spring管理的bean以應用方面,即你應獲得ApplicationContextSubscription類型的對象如下:

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

或讓他們注射的使用@Resource@Autowired註釋。

然後,調用setStatus()subscription對象將通過由Spring框架創建的AOP代理和AOP建議中匹配方法定義的代碼得到執行。

使用new運算符創建對象時,獲取彈簧管理Bean的另一種方法是使用@Configurable註釋。

+0

啊,廢話......謝謝Vikdor。 – Oscar