私はしばらくスプリングを使用してきましたが、どのように機能するのか、具体的には、インターフェイスまたは@annotationでのみマークされたBean /クラスをロードおよびウィーブする方法を常に疑問に思っていました。
xml宣言の場合、Springが私のBeanをどのように前処理するか(それらはSpringが読み取るxmlコンテキストで宣言されています)を簡単に確認できますが、注釈のみでマークされたクラスの場合、その動作を確認できません。エージェントをjvmなどに渡します。
何らかの基準でクラスを前処理できるJava / JVMフックがあると思いますが、ドキュメントで何も見つけることができませんでした。
誰かが私にいくつかのドキュメントを教えてもらえますか?これはjava.lang.instrument.ClassFileTransformer APIに関連していますか?
実際、デフォルトでは、SpringはXMLやBeanで構成されたBeanに対してバイトコードの後処理を行いません。代わりに、関連するBeanが動的プロキシにラップされます(java.lang.reflect.Proxy
Java SDK などで参照)。動的プロキシは、使用する実際のオブジェクトをラップし、メソッド呼び出しをインターセプトして、AOPアドバイスを適用できるようにします。違いは、プロキシは本質的にフレームワークによって作成された新しい人工クラスであるのに対し、ウィービング/バイトコードの後処理は既存のものを変更することです。後者は、あなたが言及したインストルメンテーションAPIを使用しないと不可能です。
アノテーションについては、<context:component-scan>
タグの実装は、Springアノテーションを含むすべてのクラスのクラスパスをスキャンし、それらのSpringメタデータプレースホルダーを作成します。その後は、XMLを介して構成されたかのように扱われます(より具体的には、両方が同じように扱われます)。
Springはバイトコードの後処理自体を実行しませんが、プロキシが満足しない場合は、Springで正常に動作するAspectJウィービングエージェントを構成できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加