23

私はしばらくの間Springを使用してきましたが、それがどのように機能するのか、より具体的には、インターフェースまたは@annotationのみでマークされたBean/クラスをどのようにロードして織り込むのかを常に考えていました。

xml宣言の場合、springがBeanを前処理する方法を簡単に確認できます(Springが読み取るxmlコンテキストで宣言されます)が、アノテーションのみでマークされたクラスの場合、それがどのように機能するかはわかりません。任意のエージェントをjvmなどに渡します。

ある種の基準でクラスを前処理できるJava/JVMフックがあると思いますが、ドキュメントで何も見つけることができませんでした。

誰かが私にいくつかのドキュメントを教えてもらえますか?これはjava.lang.instrument.ClassFileTransformerAPIに関連していますか?

4

1 に答える 1

32

実際、デフォルトでは、SpringはXMLまたはアノテーションで構成されたBeanに対してバイトコードの後処理を行いません。代わりに、関連するBeanが動的プロキシにラップされます(たとえば java.lang.reflect.Proxy、Java SDKを参照)。動的プロキシは、使用する実際のオブジェクトをラップし、メソッド呼び出しをインターセプトして、AOPアドバイスを適用できるようにします。違いは、プロキシは基本的にフレームワークによって作成された新しい人工クラスであるのに対し、ウィービング/バイトコードの後処理は既存のクラスを変更することです。後者は、前述のInstrumentationAPIを使用しないと不可能です。

アノテーションに関しては、タグの実装により<context:component-scan>、Springアノテーションを持つすべてのクラスのクラスパスがスキャンされ、それらのSpringメタデータプレースホルダーが作成されます。その後、それらはXMLを介して構成されたかのように扱われます(より具体的には、両方が同じように扱われます)。

Springはバイトコードの後処理自体を実行しませんが、プロキシが満足できない場合は、Springで正常に動作するAspectJウィービングエージェントを構成できます。

于 2008-10-23T20:50:20.230 に答える