0

説明するのが難しい問題があるので、始めましょう:

コンテキスト: Tomcat サーバーでアプリケーションを実行しています。これを「管理者」と呼びましょう。管理者には、インポート/エクスポート機能があります。私たち自身のアプリケーションはそれを拡張したものであり、「管理アプリ」がインポート/エクスポート機能を使用するときにいくつかの情報を収集する必要があります。

問題: クラス ImportController を含むサード パーティの jar は次の場所にあります~/someFolder/admin/WEB-INF/lib/admin.jar。目標は、拡張機能がクラスを適切なプロジェクトにリンクできるように、古いプロジェクト ID と新しいプロジェクト ID を収集することです。私はメソッドの署名を知っているので、AOPを使用してそうすることができます。

アイデア: 私が思いついたアイデアidHiJacker.jarは、単一のポイントカットとアドバイスを含むようなものを に配置し~/someFolder/admin/WEB-INF/lib/、ロード時の織り込みを可能にすることです。そのアドバイスは単に情報を xml ファイルに入れるだけなので、プロジェクトのインポート後にリンクを元に戻したいときに拡張機能がそれを読み取ることができます。

また、私は AOP と Web に関する純粋な初心者だと言わざるを得ません。しかし、AOP でこの小さな操作を行うためだけにモンスターをインポートしたくありません。現在、aspectJ と AspectWerkz を読んでいます。

質問:

  • 1) 私は正しい方向に進んでいますか? このアイデアがまったく機能しない原因が何かわかりますか?
  • 2)これが可能であれば、非常にきれいな方法でそれを行うための良い習慣は何ですか?
  • 3)AspectJでやるべきですか?アスペクトワークス? または、他の何か?
  • 4)私はこれを無料でやっていますか?その操作を行う簡単な方法はありますか?

編集:また、回答にリンクするための優れたチュートリアルがあれば、それは素晴らしいでしょう

お時間とご回答ありがとうございます

4

2 に答える 2

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?

インポート コントローラーのコードを変更するか、クライアントを変更して、リンク処理を実行するための追加の呼び出しを行うことができない限り、このインターセプト ベースのアプローチが最適と思われます。

于 2012-06-06T15:51:11.450 に答える
0

より簡単な解決策を提案します - デコレータ パターンを使用してサード パーティの ImportController をラップし、サード パーティのライブラリが呼び出される前に機能を配置します。管理アプリケーションにアクセスできるように見えるので、これを行うことができるはずです。

これは基本的に AOP が行っていることですが、コードを使用しています。ロードタイムウィーバーを使用したアプローチも機能するはずですが、私の意見では複雑です-この方法を絶対に計画している場合は、AspectJを使用してください。

于 2012-06-06T15:38:25.997 に答える