問題タブ [cglib]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Spring アノテーションが設計ガイドラインと競合する
概要
使用方法
- Spring 3.0.1 (アノテーション構成)
- 現在の構成では、プロキシ作成者として CGLib を使用していますが、これは私の好みではありません
- トランザクションは、特別な設定なしで構成されたアノテーションです
- すべての構成は、注釈 (
@Service、@Transactional、@ManagedResource、@Injectなど)で行われます。
- Hibernate 3.5 (エンティティには javax.persistence のアノテーションが付けられます)
ガイドラインのハイライト
- アノテーションが付けられた、
@Repositoryまたは@Serviceインターフェイスが必要なすべての Bean - コンストラクタ DI (再構成が不要な場合)
- コンストラクターにはデフォルトの可視性があります (
Foo(Bar bar) {...})
- コンストラクターにはデフォルトの可視性があります (
- Bean フィールドはfinalです (再構成が不要な場合)
- デフォルトのコンストラクターがありません
- 実装は、最終修飾子 ( )を使用してデフォルトで表示されます
final class Foo
問題
- CGLib は最終クラスをプロキシできません
- CGLib にはデフォルト (空の) コンストラクターが必要です
- 一部のサービスは JMX 経由で公開する必要があります
- CGLib によってプロキシされない限り、MBean エクスポータが機能しない
- 一部
@Transactional@Serviceの は、ファサード トランザクションに複数のサービスを含める必要があるファサード サービスを介してアクセスされます (例: 2 つのアプリケーション コンポーネントに対するオブザーバー サービス)。 - 一部のインターフェースには複数の実装があります (現在は で区別されています
@Qualifier) 。 - 将来のガイドライン (または機能があると便利) - 各アプリケーション モジュールには
beanRefContext.xml、内部アプリケーション コンテキストを構成するためのファイルがあります。
XML 構成を使用していたときは、上記のすべてのガイドラインを適用できましたが、注釈に切り替えると、Spring が正しく動作していないように見えます。
私のグループの開発者は、アノテーション構成を好みます (新しいコードを配線して記述する方が簡単なようです) が、Spring アプリケーション コンテキスト エラーの処理を防ぐためにコードに導入されたあらゆる種類の「ハック」に気付きました。
質問)
- アノテーション構成を使用する際に従うべきベストプラクティスはありますか?
- インターフェースごとに複数の実装を使用する場合 (
@Primaryまたはの使用を減らしようとしている@Qualifier) - 使用時
@Transactional - 使用時
@ManagedResource - 上記を組み合わせて使用する場合
- インターフェースごとに複数の実装を使用する場合 (
- CGLib の使用を停止し、アノテーション構成を保持したまま、アノテーション付きの MBean をエクスポートできる方法はありますか?
- 私のガイドラインのほとんど (できればすべて) を維持するための適切な実装は何ですか?
java - ボックス化、ボックス化解除、cglib、スプリング、および NoSuchMethodError の謎
プロジェクトでSpringとGWtを使用しています。NoSuchMethodErrorSpring Bean プロキシのメソッドを呼び出すと、CGLIB によってスローされることがほとんどありません。
Integerエラーを見ると、基本intフィールドではなくオブジェクトを使用してメソッドを見つけようとしていることがわかります。
たとえば、Spring Beanでそのように定義されたメソッドがあります
このメソッドを呼び出すと、エラーがスローされます。これは、基本フィールドではなくフィールドを持つNoSuchMethodErrorメソッドを検索しようとしていることを示します (I キーを使用)saveObjectjava.lang.Integerint
どうしたの ?ボックス化/ボックス化解除の問題はありますか? このメソッドを整数ではなく基本的な int で呼び出すことを正確に示します。
java - CGLibとシリアル化
私がやりたいのは、コマンドパターンを実装するクラスをシリアル化して、後で実行できるようにすることです。すべての世界で、匿名クラスをシリアル化したいと思います(これに関する問題を認識しています)
少し複雑なのは、私が春の環境にいて、シリアル化する匿名クラスがCGLibによってプロキシされるクラスで定義されていることです。
私の最初の試み:
たとえば、storeJobはオブジェクトをシリアル化し、後で使用できるように保存します。失敗するのはこの部分です。このためのコードは含まれていませんが、これは単なるObjectOutputStream呼び出しです
TestServiceクラス全体をシリアル化する必要があることを認識しています。問題は、ラップされてCGLibプロキシがスローされ、このプロキシがシリアル化可能を実装していないことです(これはシリアル化できないと思います)。
どんな助けでも大歓迎です。
java - Java Service Provide APIはどのように機能するはずですか?
誰もがJavaServiceProviderで不快なブラシを持っているようです。これは、 META-INF / services / com.example.Interfaceのような名前のファイルで実行できますが、適切なXMLパーサーをロードする以外は誰も使用しません。 。Service Provider APIを使用するライブラリを操作しようとしていますが、実際にはインターフェイスを実装していないが、簡単に実装できるランタイム拡張クラス(cglibを使用)を提供できるようにトリックしています。
基本的に、実行する必要のある手順は次のとおりです。
- getResources(...)に応答し、「追加の」URLを返すカスタムクラスローダーを作成します
- また、そのクラスローダーフックgetResourceAsStream(...)を使用して、「追加の」リソースを要求されたときに、cglibで操作するクラスのリストを返します。
- 最後に、要求されたときにそのクラスローダーにそれらのクラスをロードさせます
しかし、ここで私は迷子になります。たとえば、ライブラリがそこにある実装者を判別しようとすると、getResources(...)を呼び出して、一連のURLを返します。ただし、getResourceAsStream(...)はURLを使用せず、「名前」を使用します。クラスパスに関連しているように見える名前。したがって、どこでも同じです。つまり、META-INF / services / com.example.Interfaceは、JARのMETA-INF / services / com.example.Interfaceと同じ「名前」を持っていますよね?どういうわけかこれがそれらの爆破されたXMLパーサーで機能することを除いて...
もちろん、これはすべて、ClassLoader.getSystemResources(...)、ClassLoader.getSystemResourceAsStream(...)などを使用するのではなく、ClassLoader.getSystemClassLoader()を呼び出すのに十分賢い/親切であることを前提としています。 ClassLoaderをフックして、偽のファイルを提供する方法はありません。
その場合、cglibで実行するまで待つのではなく、コードがMavenによってパッケージ化されているときに、BCELを使用してクラスファイルを操作できると思いますか?
java - 多くの AOP リクエスト スコープ Bean を使用する場合のパフォーマンスの問題
私はSpring 3を使用して準大規模なアプリケーションに取り組んでおり、一度に何百人ものユーザーを投入するとパフォーマンスの問題が発生します. Spring の AOP プロキシを使用していくつかのリクエスト スコープ Bean を使用しています。これらの Bean のいずれかでメソッドを呼び出すたびに、CGLIB インターセプターが呼び出され、AbstractBeanFactory.getBean() が呼び出され、add() が呼び出されることがわかります。既存の Spring Bean の同期セット。この add() は同期されているため、同じリストへの追加を待機している何千もの呼び出しがあると、サーバーが効果的にロックされます。
リクエストスコープのBeanを使用してこれを回避する方法はありますか? Bean がインターフェイスを実装している場合は CGLIB が使用されないことを Spring のドキュメントで読みました (http://static.springsource.org/spring/docs/2.0.0/reference/aop.html#d0e9015) が、私のリクエストはスコープ Bean です。すべてが1つ(実際には同じもの)を実装しており、それはまだ起こっています。また、Bean のフィールドの一部は特定のリクエストに対してアプリの一部で計算され、SpEL を使用して同じリクエスト中にアプリの別の部分で値を取得するため、Bean をリクエスト スコープにする必要があります。Bean プロトタイプをスコープ化した場合、SpEL を使用して 2 回目に取得したときに新しいオブジェクトが得られると思います。
これは私の問題を示すコードサンプルです。私が問題を抱えている正確な場所を説明するコメントについては、最後の 2 行を参照してください。
私のアイデアは次のいずれかです。
- Bean で行われたすべてのメソッド呼び出しをプロキシせずに、スコープ指定された Spring Bean リクエストを作成できますか? そして、すべてのメソッドを「最終」としてマークせずに?
また...
- Spring の Bean ファクトリをオーバーライドして、AbstractBeanFactory.getBean() を呼び出す前に Bean がキャッシュされているかどうかを確認する Bean キャッシュを実装できますか? もしそうなら、カスタム Bean ファクトリーを使用するように Spring をどこで構成すればよいでしょうか?
spring - @Transactional、Spring 2.5、および cglib を使用したデプロイでの AbstractMethodError
これでお役に立てば幸いです。Spring@Transactionalアノテーションを使用してメソッドをトランザクションとしてマークしていますが、必要な<tx:annotation-driven transaction-manager="txManager"/>. 私のビルドには Spring 2.5.6 と cglib 2.1_3 が含まれています。
(Websphere 7 ランタイムへの) デプロイ時に、Bean 作成の例外が表示されます。根本的な原因は次のとおりです。
これは、そのメソッドを実装していないgenerateClass(...)のインスタンスでメソッドを呼び出していることを意味していると思います。AbstractClassGeneratorこれらすべてがSpringで透過的に設定されているように見えるので、問題を解決するためにここからどこに行くべきかわかりません...何かアイデアはありますか?
grails - 統合テストが失敗する - Grails の自動配線の問題
なんらかの理由で、統合テストを実行しようとすると、次の結果が得られます。
CGLib が注入されたクラスをラップし、テストが失敗するのはなぜですか? grails 1.3.6 を実行しており、Intelli-J Ultimate 10.01 でテストを実行しています。
java - Spring MVC の Integer (Final クラス) の CGLib プロキシ
私はそのような使用法が必要です:
リクエストごとに userId を DemoController に注入したいのですが、空のコンストラクターのない最終クラスであるため、注入できません。そのような場合のベストプラクティスは何ですか? リクエストスコープのサービスでいいの?
java - CGLib ミックスインの例
Java CGLib Mixinクラスの使用法について、誰かが私に良い例を教えてくれますか? 私は掘り下げてきましたが、どれも十分に単純ではないようです。
java - Spring - CGLIB プロキシを強制できないため、クラスキャスト例外が発生する
これが私を夢中にさせているシナリオです。
- 私はルックアップメソッドを持つクラスを持っています - createOther()
- createOther は、タイプ Other のオブジェクトを作成する必要があります。Other は OtherInterface を実装し、さらに @Async とマークされたメソッド doSomething を持っています
- Other は OtherInterface を実装しているため、Spring は、Other としてキャストできない JDK プロキシを提供します。
- Spring のドキュメントでは使用
<aop:config proxy-target-class="true">が推奨されていますが、私はその初心者であり、それを使用しても役に立たないようです。
質問: Other クラスをターゲットとする CGLib プロキシが必要であることを Spring に伝えるにはどうすればよいですか?
以下のコードは、classcastexception で失敗します。
App.java:
}
** その他.java **
** appcontext.xml **