6

どちらも Spring プロジェクトであり、それぞれに applicationContext.xml を持つ 2 つのサブプロジェクトで構成されるプロジェクトがあります。

1 つはフレームワーク プロジェクト (最終的に JAR になる) で、もう 1 つは実際のアプリケーション (最終的に WAR になり、JAR に依存し、JAR の applicationContext.xml を独自の applicationContext.xml にインポートする) です。

フレームワーク プロジェクトでは、すべてのパブリック メソッドのアスペクトを定義しました。

@Aspect
@Configurable
public class MyAspect {

    @Autowired
    private SomeBean mBean;

    @Pointcut("execution(public * *(..))")
    public void anyPublicMethod() {
    }

    @Before("anyPublicMethod()")
    public void checkAuthorization(JoinPoint pJoinPoint) {
        mBean.doSomething();
    }
}

また、フレームワークの applicationContext.xml (実際のアプリケーション プロジェクトの applicationContext.xml によってインポートされる) で AOP を有効にしました。

...
    <context:spring-configured />

    <context:component-scan base-package="com.mypackage" />

    <aop:aspectj-autoproxy/>
...

フレームワーク プロジェクトでテストする場合、Spring Bean でパブリック メソッドを呼び出すと、アスペクトが期待どおりに実行されます。

上記のように、フレームワーク プロジェクトは依存関係としてアプリケーション プロジェクトに含まれますが、Spring Bean のアプリケーション プロジェクトで一致するメソッド (すべてのパブリック) を呼び出すと、アスペクトは実行されません。

また、アスペクトの XML 構成を使用してみました。それは同じ行動につながります。

4

4 に答える 4

4

IMHO、アプローチを少し調整できます。

最初に行うことは、戦争のアプリケーション コンテキストの構成を web.xml に委譲することです。

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>WEB-INF/classes/spring*.xml</param-value>
</context-param>

次に、war ファイルのアプリケーション コンテキストで aop を有効にします。ここで使用したいからです。現時点では、Web プロジェクトで取得するためだけに aop 構成でアプリケーション コンテキストをインポートしているように聞こえますが、これはおそらく間違っています。

最後に、これらはランタイムであり、コンパイルされたアスペクトではないと仮定しています。後者の場合、依存関係に関係なく、戦争プロジェクトでアスペクトJを使用して再コンパイルする必要があります。

于 2012-04-18T09:29:01.510 に答える
1

Spring MVC webappsでは、実際にはルート コンテキストとサーブレットのコンテキストの 2 つのコンテキストがあります。サーブレットのコンテキストでアスペクトを設定してください。実際、サーブレットのコンテキストはルート コンテキストを「認識」しますが、その逆は認識しません。

Web MVC フレームワークでは、各 DispatcherServlet に独自の WebApplicationContext があり、ルート WebApplicationContext で既に定義されているすべての Bean を継承します。これらの継承された Bean は、サーブレット固有のスコープでオーバーライドでき、特定のサーブレット インスタンスに対してローカルな新しいスコープ固有の Bean を定義できます。

そのため、アスペクトをその Bean に適用する場合は、フレームワーク構成のインポートを[servlet-name]-servlet.xml他のファイルではなくファイルで行う必要があります。

于 2013-03-21T11:01:34.370 に答える
0

春に認識されるようにするには、アスペクトをコンポーネントにする必要があると思います。

http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/aop.html#aop-at-aspectj

コンポーネントスキャンによるアスペクトの自動検出

アスペクト クラスを通常の Bean として Spring XML 構成に登録するか、クラスパス スキャンによって自動検出することができます。これは、他の Spring 管理 Bean と同様です。ただし、@Aspect アノテーションは、クラスパスでの自動検出には不十分であることに注意してください。そのためには、別の @Component アノテーション (または、Spring のコンポーネント スキャナーのルールに従って修飾されるカスタム ステレオタイプ アノテーション) を追加する必要があります。

于 2013-03-20T20:39:36.650 に答える
0

それが私がすることです:

<context:annotation-config/>
<context:component-scan base-package="my.pkg" scoped-proxy="interfaces"/> 
<aop:aspectj-autoproxy proxy-target-class="true" />

あなたのケースでうまくいくかどうかはわかりませんが.... githubであなたのプロジェクトの簡素化されたバージョンをセットアップすると役に立ちます。

これには、バイトコードの織り込みや jvm の計測は必要ありません。問題のメソッドを呼び出すときは、自動挿入された属性を使用していることを確認してください。

@Autowired
private MyType myTypeInstance; // MyType is usually an interface

public void someMethod() {
    // myTypeInstance is actually a proxy object... thereby providing the
    // access point for the weaving stuff. (as far as I understand it)
    myTypeInstance.method();
}

それ以外の場合は、 Spring 管理の AOP クラス プロキシが気に入らない場合は、次の手順に従ってください。

于 2013-03-20T04:54:08.177 に答える