3

サービスを公開 (エクスポート) する OSGi バンドル (私が所有していないため、変更できません!) がEchoServiceあり、このサービスのメソッドにアスペクトをアタッチしたい (前処理/後処理を実行するため)その周りに)。これらは Apache Felix コンテナーにデプロイされます。

私は独自の OSGi バンドル (明らかに をインポートするEchoService) を作成し、標準の Spring AOP を使用して Spring の側面をそれにアタッチしました。ただし、アスペクトが接続されておらず、インターセプターが呼び出されていないようです。

これは、自分のバンドルに属していないサービスを傍受しようとしているためだと思われます (これは合理的に思えます)。あれは正しいですか?どうすればこれを克服できますか?

私のインターセプター/アスペクトは次のようになります。

    @Before("serviceOperation()")
    public void before(JoinPoint jp) {
        logger.debug("Entering method: " + jp.toShortString());
    }

    @AfterReturning("serviceOperation()")
    public void after(JoinPoint jp) {       
        logger.debug("Exiting method: " + jp.toShortString());      
    }
4

1 に答える 1

1

私は AOP や Spring の専門家ではありませんが、いくつかのアイデアを提供できるかもしれません。私の知る限り、Spring は AOP プロキシに標準の J2SE 動的プロキシを使用しています。したがって、クライアントは元のオブジェクトの代わりにプロキシを使用する必要があります。これは、 「プロキシは実際のクラスをサブクラス化することによって作成される」EchoServiceため、CGLIB プロキシを使用している場合にも当てはまります。

クライアントがバンドルを要求する場合、EchoService何らかの方法でプロキシを渡す必要があります。OSGi コンテナ内でこれを行うには、EchoService(プロキシ) もエクスポートし、クライアントがオリジナルではなく、プロキシされたサービス/バンドルを使用するようにする必要があります。これを実現するには、(プロキシされた) パッケージに別のバージョン番号を設定し、このバージョンをクライアント バンドルのインポート要件として設定します。( のクライアントを変更できると思いますEchoService。) サービスの場合、登録時にプロパティを設定し、このプロパティを持つサービスのみを照会するようにクライアントを変更できます。

クライアント バンドルを変更できない場合、別の解決策として、元のバンドルをバンドル内の内部 jar としてラップすることができます。アクティベーターからラップされたバンドルのアクティベーターを呼び出して、変更された を渡すことができますBundleContext。これによりBundleContext、登録中のサービス呼び出しがキャッチされ、元の の代わりにプロキシ オブジェクトが登録されますEchoService。などは通常インターフェイスであるためBundleContext、単純なデリゲート パターンを使用できます。ServiceListenerうまくいくと思いますが、他の課題があるかもしれません。

于 2011-09-25T17:18:26.087 に答える