2012-06-06 110 views
0

的Tomcat應用程序的方法,我要解釋一個問題,就是很辛苦,所以讓我們開始:攔截用AOP

語境:我有一個Tomcat服務器上運行的應用程序,可以把它稱爲「管理員」。管理員具有導入/導出功能。我們自己的應用程序是對此的擴展,當「管理應用程序」使用導入/導出功能時,我們需要收集一些信息。

問題:包含類ImportController的第三方jar位於此處:~/someFolder/admin/WEB-INF/lib/admin.jar。我們的目標是收集舊的項目ID和新的項目ID,以便我們的擴展可以將我們的類與正確的項目聯繫起來。因爲我知道方法簽名我雖然我可以使用AOP來這樣做。

想法:我帶來的想法是將類似idHiJacker.jar的東西放入~/someFolder/admin/WEB-INF/lib/並啓用加載時織入。該建議只需將信息放入xml文件中,以便我們的擴展程序能夠在項目導入後將鏈接置回時讀取它。

另外我必須說我是一個純粹的新手與AOP和網絡的東西。但我不希望導入一個怪物,只是用AOP做這個小操作。在關於AspectJ和AspectWerkz

瞬間即時閱讀

問:

  • 1)我是在正確的方向?你有沒有看到任何會使這個想法不起作用的東西?
  • 2)如果這是可能的,那麼以非常乾淨的方式做到這一點最好?
  • 3)我應該用AspectJ來做嗎? AspectWerkz的?或者是其他東西?
  • 4)我是不是這麼做了?有沒有更簡單的方法來做這個操作?

編輯:另外,如果你有很好的教程與答案聯繫起來,這將是真棒

感謝您的時間和回答

回答

1

問:

1) Am I in the right direction? Do you see anything that would make this idea not work at all? 

我看不到任何理由,這是不行的。除了Aspect Oriented Programmingcross-cutting之外,advice的概念是在某個其他切入點之前或之後執行某些切入點,並且通常會影響該建議函數的行爲。你正在這裏做這件事。

2) If this is possible what would be the good practice to do it in a very clean manner? 

有多個方面的/建議一些固有的混亂 - 因爲控制流被劫持更多的則是需要一個簡單的代碼順序讀取明白怎麼回事。

3) Should i do it with AspectJ? AspectWerkz? Or Something else? 

我從來沒有使用AspectWerkz的,但我有AspectJ的很好的經驗;特別是在這裏對stackoverflow的支持方面,甚至可能在其郵件列表上更多。

4) Am i doing this for nothing? Is there an easier way to do that operation? 

除非你可以改變進口控制器的代碼或改變客戶做出額外要求做的事情聯繫起來這種攔截爲基礎的方法似乎最好恕我直言。

+0

謝謝你的回答,我的問題是,這是有點難以注入AOP。我剛剛注意到,「管理應用程序服務器」是以一個複雜的bash腳本開始的。所以首先我要弄清楚如何啓用加載時編織 – drgn

+0

@drgn ltw不是很困難。最大的挑戰將是如何修改腳本以添加代理和附加jar。另一種方法是使用編譯時織入來對現有類進行檢測,並用裝有儀器的jar替換jar部署的jar。不知道如果jar被簽名,那是如何工作的。 –

+0

將一個簡單的aop.xml放入WEB-INF之後,我的jar只包含一個方面(從支持aspectJ的eclipse jar中導出)並添加了javaagent(之前的評論),這是行不通的。問題是我沒有錯誤消息,我把冗長的選項放在aop.xml中,但我沒有來自編織器的消息。我一定做錯了什麼。 – drgn

0

我有一個簡單的解決方案建議 - 使用一個裝飾圖案環繞第三方ImportController,在第三方庫被調用之前放置你的功能。你應該可以做到這一點,因爲你似乎有權訪問管理應用程序。

這實質上是在做AOP正在做的事情,但是使用的是代碼。使用加載時織布工的方法也應該起作用,但在我看來很複雜 - 如果你絕對打算這樣做,那麼請使用AspectJ。

+1

OP將如何將裝飾後的'ImportController'注入到第三方應用程序中? –

+0

這根本不是一個壞主意,因爲「管理應用程序」是以複雜的bash腳本啓動的,所以我會記住它作爲輔助解決方案,並且我可能無法成功啓用加載時織入。感謝這個好主意 – drgn