2016-05-16 74 views
4

我只是想知道,Spring框架中的Pointcut如何在內部工作。它如何知道接下來要執行的方法(然後在方法執行之前/之後執行它的工作)?它以某種方式使用反射? 即使我將調試點放在Pointcut定義中,調試器也不會觸發它。Spring框架中的切入點如何在內部工作

+0

這只是基於AspectJ的編織(加載時間或編譯時間)? –

+0

@TeemuIlmonen不,通常是Spring Auto Proxies。您可以啓用AspectJ,但通常自動代理是默認選擇。 –

+2

Spring將所有豆子放入單獨的袋子(代理)並觀察這些袋子之間的相互作用。 Spring不會考慮包包本身的相互作用。只有行李(代理)之間的呼叫被攔截,這是執行前後條款的時間。 – Palcente

回答

5

它通過代理您的預期方法來實現。對您的方法的調用被替換爲對代理方法的調用。代理方法首先執行註解之前,然後調用您的原始方法,然後執行註解之後。

代理方法是syntetic,它沒有出現在你的代碼中,所以你不能添加斷點。

0

那麼我的理解是,這是一個編織過程。如果您認爲您的切入點只是簽名,它們可以靈活地從包,界面,類或方法甚至通配符中進行選擇。

當你的應用程序加載春天排序產生的所有目標的代理,這就是爲什麼在我看來,它不是使用通配符,而不是適用於特定目標的好主意。在目標上創建代理的過程實際上是編織。

調試器不工作的原因是因爲該類未被調用,而是由Spring創建的代理。是的,春天廣泛使用反思。

我曾經試着將Aspects放在JAX-RS類上,但它失敗了,因爲Spring創建的代理沒有被JAX-RS資源考慮,並且沒有被解僱。

此外,我使用通配符,然後在任何異常的任何堆棧跟蹤中,我可以看到堆棧跟蹤中某處的Spring代理調用。

P.S它比知識更多的是觀察。