2

既存のオブジェクト スプリングを管理するにはどうすればよいですか? Springs AoPを使用して機能に接続したいと思いaspectjます。Spring AoPおそらくオブジェクトとともに作成される動的プロキシを使用するため、これが課題であることはわかっています。

なぜこれが必要なのですか?

runtimeでのみ知られているコンストラクター引数を取るサードパーティのクラスがあるためそれを自分に追加したり、構築にスプリングインターフェイスを使用したりできないようです。他に方法はありますか?applicationContextFactoryBean

私はすでに次のことを試しましたが、大きな成功はありませんでした:

Obj obj = new ThirdPartyObj("runtime constructor arg");
appContext.getAutowireCapableBeanFactory().initializeBean(obj, "Obj");

春に管理されている可能性がありますが、アスペクトをトリガーするために使用することはまだできません。


[編集] axtavtが指摘した問題は、 から返されたオブジェクトを使用していないことinitializeBean(..)です。上記のアプローチは両方とも機能しますが、次の場合にのみ機能します。

  • インターフェイスを使用するObjInterface obj = (ObjInterface) ac.getBean("obj", args);か、次を取得します。

    java.lang.ClassCastException: $Proxy28 cannot be cast to com.company.Obj

  • インターフェイスを使用せず、有効にしCGLIBます。これには、プライベートではないデフォルトのコンストラクターが必要です。そうしないと、次のようになります。

    java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given

4

3 に答える 3

5

の機能をラップする新しいクラスを作成し、ThirdPartyObjそれSpring 管理にしないでください。その後、依存関係をそのフィールドとメソッド パラメータに注入し、インスタンス化された に渡すことができますThirdPartyObj

于 2011-03-13T10:07:15.007 に答える
2

これを使用してアスペクトをトリガーできるはずです (プロキシである可能性のある返されたオブジェクトを使用する必要があることに注意してください)。

Obj obj = new ThirdPartyObj("runtime constructor arg");     
obj = appContext.getAutowireCapableBeanFactory().initializeBean(obj, "Obj"); 

別のオプションは、それを通常の Bean として宣言し、次のようにしてコンストラクター引数を渡すことgetBean()です。

Obj obj = appContext.getBean("Obj", "runtime constructor arg");     
于 2011-03-13T10:13:30.550 に答える
0

ドメイン オブジェクトに @Configurable アノテーションを付けてみてはどうでしょうか。私自身は試していませんが、あなたのシナリオに役立つようです。AspectJ と Spring は、Bean で定義された属性を持つ管理対象オブジェクトを作成します。その後、作成されたオブジェクト インスタンスを使用できます。

于 2011-03-13T10:34:41.077 に答える