2011-10-17 19 views
2

1つのmavenプロジェクトモジュールにcom.x.NiceAspectというアスペクトがあり、別のmavenモジュールにcom.x.NiceClassというクラスがあります。これらのモジュールには同じPOM親があり、一緒に1つのプロジェクトを作成します。Spring AOPのアスペクトが別のモジュールで使用されている

私が達成しようとしていることは、このプロジェクトのすべてのmavenモジュールに含めることができる普遍的な側面を持つことです。

今NiceAspectでポイントカットは私のパッケージ内のすべてのsetterメソッドを意味し、すなわち実行(* com.x .. .SET(..))です。

私はどのように私はこれを達成することができ、特にNiceClass

に参加するために、この態様は第二のモジュールで実行したいですか?

またアスペクトは、私は循環依存関係で終わる、その第二のモジュールで定義されていたクラスの引数を望んでいるとし...

をすべてのヘルプは

敬具、

を高く評価しましたバツ。

答えて

0
  • 私はポイントカットは、「別の」モジュールからの方法と一致した場合、アスペクトが適用されます特にNiceClass

    に参加するために、この態様は第二のモジュールで実行したいです。依存関係を正しく設定するだけでなく、何も特別な処理を行う必要はありません。例えば、あなたのAOP構成をグローバルにインポートすることができます。また

  • アスペクトが、私は循環依存関係で終わる、その第二のモジュールで定義されていたクラスの引数を望んでいるとし...

    クラスの引数のアスペクト依存性がにつながるべきではありませんあなたは2つを接続する親POMを持っているので、実行時には両方のモジュールがクラスパスにあります。一般に

、スプリングdocumentation =によって記載されるようにアスペクト構造に従うことが推奨され>全体SystemArchitectureアスペクトを作成し、必要に応じて、より狭くスコープの側面を追加:

@Aspect 
public class SystemArchitecture { 

    /** 
    * A join point is in the web layer if the method is defined 
    * in a type in the com.xyz.someapp.web package or any sub-package 
    * under that. 
    */ 
    @Pointcut("within(com.xyz.someapp.web..*)") 
    public void inWebLayer() {} 

    /** 
    * A join point is in the service layer if the method is defined 
    * in a type in the com.xyz.someapp.service package or any sub-package 
    * under that. 
    */ 
    @Pointcut("within(com.xyz.someapp.service..*)") 
    public void inServiceLayer() {} 

    /** 
    * A join point is in the data access layer if the method is defined 
    * in a type in the com.xyz.someapp.dao package or any sub-package 
    * under that. 
    */ 
    @Pointcut("within(com.xyz.someapp.dao..*)") 
    public void inDataAccessLayer() {} 

    /** 
    * A business service is the execution of any method defined on a service 
    * interface. This definition assumes that interfaces are placed in the 
    * "service" package, and that implementation types are in sub-packages. 
    * 
    * If you group service interfaces by functional area (for example, 
    * in packages com.xyz.someapp.abc.service and com.xyz.def.service) then 
    * the pointcut expression "execution(* com.xyz.someapp..service.*.*(..))" 
    * could be used instead. 
    * 
    * Alternatively, you can write the expression using the 'bean' 
    * PCD, like so "bean(*Service)". (This assumes that you have 
    * named your Spring service beans in a consistent fashion.) 
    */ 
    @Pointcut("execution(* com.xyz.someapp.service.*.*(..))") 
    public void businessService() {} 

    /** 
    * A data access operation is the execution of any method defined on a 
    * dao interface. This definition assumes that interfaces are placed in the 
    * "dao" package, and that implementation types are in sub-packages. 
    */ 
    @Pointcut("execution(* com.xyz.someapp.dao.*.*(..))") 
    public void dataAccessOperation() {} 

} 

この方法を任意将来必要となるかもしれない側面は、システムアーキテクチャ全体のアプローチを再利用し、実際のモジュールと一緒に暮らすことができます。

+0

ありがとうございました。このパターンを私のプロジェクトに適用します。どうやら私は実行する方法を知っていない/コンパイル/パッケージは、春のaopプロジェクトをjarにする。私はAspectJで少し経験がありますが、Spring AOPアプリケーションの構築方法はわかりません。あなたは何の目標を実行していますか?私の面はうまくいきません。私はIDEA Community Edition 10.5.2を使用しています。 – emesx

+0

'spring aop project'は他の非Webプロジェクトと変わりありません。また、jarファイルは他のものと同様にmavenによって作成されます。 AspectJを使用している場合、この[example](http://www.dotkam.com/2010/10/12/running-spring-aspectj-tests-with-maven/)を見て、どのようにそれを見ることができますmavenで構成されています。 – tolitius

+0

ありがとう;-)私はここから管理すると思います。 – emesx

0

メインプロジェクトにサブプロジェクトとして宣言されているすべてのプロジェクトがある場合、アスペクトを含むアスペクト(したがってアスペクト自体)は他の2つのプロジェクトで使用でき、基本的にサブプロジェクトのいずれかが依存性を持ちますサブプロジェクト

あなたが原因の包装に循環依存を持っていません。

  • あなたが実行可能なjarファイルとしてあなたprjectのいずれかをパッケージ化した場合、それは実行するためには、あなたが他の二つのsubbrojectsを追加する必要がありますあなたがそれを実行するときに最初のクラスパスにjarファイル

  • あなたのサブプロジェクトを戦争(そして他の2つはjar)としてパッケージ化すると、他の2つのサブプロジェクトのjarがwarのlibに追加されますフォルダを使用することで、実行時に戦争のクラスパスを有効にすることができます。

+0

ありがとうございました – emesx

関連する問題