27

私はJersey Restを使用しており、Jerseyフィルターが春の豆にアクセスできるようにしたいと考えています。

ただし、他のスレッドから発見したように、生成された Java プロキシではなく Java プロキシである場合、Jersey は Spring Bean を取得しません。proxy-target-class="true" を追加したい

これを行うとどのような影響がありますか? また、これを単一の Bean に設定できますか、または参照されるすべての Bean に設定する必要がありますか?

4

3 に答える 3

40

設定すると、jdk プロキシの代わりにプロキシにproxy-target-class="true"使用されます。CGLIB2

ドキュメントで説明されているように、影響は次のとおりです。

  • 最終的な方法はオーバーライドできないため、アドバイスできません。

  • クラスパスには CGLIB 2 バイナリが必要ですが、動的プロキシは JDK で利用できます。Spring は、CGLIB が必要で、CGLIB ライブラリ クラスがクラスパスに見つからない場合に自動的に警告します。

  • プロキシされたオブジェクトのコンストラクターは 2 回呼び出されます。これは、プロキシされるオブジェクトごとにサブクラスが生成される CGLIB プロキシ モデルの自然な結果です。プロキシされたインスタンスごとに、2 つのオブジェクトが作成されます。実際のプロキシされたオブジェクトと、アドバイスを実装するサブクラスのインスタンスです。JDK プロキシを使用している場合、この動作は見られません。通常、プロキシされた型のコンストラクターを 2 回呼び出すことは問題ではありません。通常は代入のみが行われ、コンストラクターには実際のロジックが実装されていないためです。

また、使用して特定のコンポーネントの「ターゲットプロキシ」を作成できるはずです

proxyMode=ScopedProxyMode.TARGET_CLASS
于 2013-03-22T10:49:29.773 に答える
22

コントローラーが正式にインターフェースを実装しているにもかかわらず、CGLib-Proxy を強制する (SpringBoot 1.2.3.RELEASE with Spring 4.1.6.RELEASE):

@Controller
@Scope( proxyMode = ScopedProxyMode.TARGET_CLASS )
public class ServiceImpl implements ServiceIntf
{ .... }

これにより、有効で機能する @RequestMapping および @Transactional アノテーションが有効になります。

于 2015-08-06T13:10:38.120 に答える