2016-05-25 62 views
2

我試圖用一個簡單的Spring AOP(v4)示例使用@Before建議來創建一個就地切入點表達式,但不會調用aspect方法。我有所有必需的依賴關係(spring-aop,aopalliance,aspectweaver)。我究竟做錯了什麼?Spring AOP - @Before不執行

package com.xyz; 

public class TestClass { 
    @PostConstruct 
    public void init() { 
     test(); 
    } 
    public void test() { 
     ... 
    } 
} 

縱橫:

@Aspect 
@Component 
public class MyAspect{ 
    @Before("execution(* com.xyz.TestClass.test())") 
    public void beforeTest() { 
     ...  
    } 
} 
+0

您是否啓用了春季自動代理?你是如何創建'TestClass'的實例的? –

+0

'TestClass'是我的應用程序上下文中定義的一個bean。它在應用程序啓動時貫穿整個生命週期,但切入點從未被擊中。我在應用程序上下文中也有''。還有其他要求嗎? – user1491636

回答

0

爲什麼不執行AOP是因爲TestClass.test()未在彈簧上下文中調用但具有從TestClass.init()簡單/純調用的原因。

測試您的設置修改它類似於下面的東西,這樣的TestClass.test()調用由Spring管理

package com.xyz; 

public class TestClass { 

    public void test() { 
    ... 
    } 
} 

注入TestClass到另一個類說AnotherTestClass,並從那裏

package com.xyz; 

public class AnotherTestClass { 

    @Autowired 
    private TestClass testClass; 

    public void anotherTest() { 
    testClass.test(); 
    } 
} 
調用 test方法
+0

在我的例子中,'TestClass'是一個spring管理bean。它定義了我的應用程序上下文。這是不夠的? – user1491636

+0

不,正如我在我的回答中所提到的「TestClass.test()」被攔截,它應該通過_another bean_來調用。同一個bean中的普通調用不會在已註冊的方面踢。 –

+0

Java Bond,還有其他選擇嗎? 'TestClass'不能被自動裝配。然而,我可以讓它成爲一個Bean(在應用上下文中定義),它通過AnotherTestClass(另一個在應用上下文中定義的bean)的構造函數來設置。有沒有辦法讓它與給定的設置一起工作?謝謝! – user1491636