18

動機

クラスローディングに関する以前の質問のフォローアップとして

人気のある Spring フレームワークでアノテーションがどのように機能するのか興味があります。

考えられる解決策

私が理解している限りでは、2 つのメカニズムが使用される可能性があります。

1. クラスローディング時のバイトコード インジェクション

Spring は独自のクラスローダーを使用して、必要なクラスをロードできます。実行時に、クラスがロードされ、Spring が適切なアノテーションがあると判断すると、バイトコードを挿入して、追加のプロパティまたは動作をクラスに追加します。

したがって、 で注釈が付けられたコントローラーは、@Controllerいくつかのコントローラー基本クラスを拡張するために変更される可能性があり、関数は で注釈が付けられたときにルーティングを実装するように変更される可能性があります@RequestMapping

@Controller
public class HelloWorldController {

    @RequestMapping("/helloWorld")
    public String helloWorld(Model model) {
        model.addAttribute("message", "Hello World!");
        return "helloWorld";
    }
}

2. インスタンス化に使用されるリフレクション

@Autowiredインスタンス化の順序を処理し、構成されたプロパティをインスタンス化するために、実行時に BeanFactory によるリフレクションによって読み取ることができます。

public class Customer 
{
    private Person person;

    @Autowired
    public void setPerson(Person person) {
        this.person = person;
    }
}

質問

Spring アノテーションは実際にどのように機能しますか?

4

2 に答える 2

11

Spring はオープン ソースであるため、どのように機能するかを理解する必要はありません。内部を見てください。

  • RequestMapping注釈は によって処理されます。メソッドRequestMappingHandlerMappingを参照してください。getMappingForMethod

  • Autowired アノテーションは によって処理されます。メソッドAutowiredAnnotationBeanPostProcessorを参照してください。processInjection

どちらもリフレクションを使用して注釈データを取得し、最初のケースでハンドラー マッピング情報を構築するか、2 番目のケースで Bean を設定します。

于 2013-03-07T12:47:35.033 に答える
1

Spring コンテキストは、Bean ポスト プロセッサ インターフェイスを実装する一連のクラスによってアノテーションを理解します。そのため、さまざまなタイプの注釈を処理するには、さまざまな注釈 Bean ポスト プロセッサを追加する必要があります。

構成 xml を追加<context:annotation-config>する場合、注釈 Bean ポスト プロセッサを追加する必要はありません。

ポスト プロセッサは、Bean の初期化ごとに前処理と後処理を行うメソッドを提供します。BeanPostProcessor インターフェイスを実装する Bean を作成することにより、カスタム処理を行う独自の Bean ポスト プロセッサを作成できます。

于 2013-03-10T15:33:55.170 に答える