JavaRush /Java Blog /Random-JA /春のフレームワーク。導入
Marchello
レベル 20
Санкт-Петербург

春のフレームワーク。導入

Random-JA グループに公開済み
こんにちは!JavaRush 管理者が新しいレベルに取り組んでいる間、Spring Framework に関する一連のトレーニング記事を開始したいと考えています。はい、インターネット上にはこのトピックに関する資料がすでにたくさんあることは知っていますが、実践してわかるように、それらはすべて Hello World レベルです。ここで話したいのは、注釈を正しく配置する方法ではなく、それがすべて「内部で」どのように機能するかについてです。この記事は、すでに何らかの形でこのフレームワークを使用したことがあり、基本的な概念を理解している人を対象としています。 春のフレームワーク。 はじめに - 1

コンテキストを初期化しています。

それでは、基本から始めましょう。私の考えでは、最も重要な点の 1 つは、コンテキストがどのように設定され、Bean が初期化されるかを理解することです。ご存知のとおり、Spring が機能し始める前に、Spring を構成する必要があります。昔は、これは xml ファイルを使用して行われていました (一部のプロジェクト、主に古いプロジェクトでは、現在でもこれが行われ続けています)。このような構成ファイルの小さな例を次に示します。

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <bean id="helloWorld" class="ru.javarush.HelloWorld">
       <property name="message" value="Hello World!"/>
   </bean>

</beans>
概して、これはいくつかのコントローラーを作成してスタートアップを起動するのに十分です (起動しません)。しかし、この構成で Spring はどのように機能するのでしょうか? ここからが興味深いことになります。Spring がこの設定を理解できるようにするために、 が存在しますXmlBeanDefinitionReader。これは、xml をスキャン (解析) し、そこに記述した内容に基づいてBeanDefinitionを作成する内部 Spring コンポーネントです。BeanDefinitionBean に関する情報を格納するオブジェクトです。これには、どのクラスから (Bean) を作成する必要があるかが含まれます。範囲; 遅延初期化がインストールされているかどうか。この Bean の前に、XML に記述されている別のプロパティやその他のプロパティを初期化する必要がありますか。受信したすべてのBeanDefinitionは に追加されます。ここで、識別子は Bean (ユーザーが設定または Spring によって割り当てられた) とオブジェクト自体HashMapの名前です。BeanDefinitionすべてがBeanDefinition創造された後、新たな英雄が舞台に現れる―― BeanFactoryHashMap’eこのオブジェクトはsを反復しBeanDefinition、それらに基づいて Bean を作成し、それらを IoC コンテナに入れます。ここには微妙な違いがあります。実際、アプリケーションが開始されると、IoC コンテナにはシングルトン スコープ (デフォルトで設定) を持つ Bean が含まれますが、残りの Bean は必要なときに作成されます (プロトタイプ、リクエスト、セッション)。さて、少し余談ですが、別のキャラクターについて知りましょう。

BeanPostProcessor を紹介します。(BPP)

Bean ポストプロセッサ実際のところ、Bean は必ずしもアプリケーションのビジネス ロジックのクラスではありません。Bean はインフラストラクチャ Bean とも呼ばれます。つまり、インフラストラクチャ Bean は、ビジネス ロジック Bean (そうです、Bean が多すぎます) を構成するクラスです。詳細については後ほど説明しますが、BPP が正確に何を構成するのかをもう少し明確にするために、例を挙げます。皆さんは概要をご存知ですか@Autowired?したがって、AutowiredAnnotationBeanPostProcessorすべてのクラスが相互に埋め込まれていることを確認するのはあなた自身の責任です。 ウノウィメアン

BeanFactory に戻りましょう

BPP について理解したところで、 を反復処理するときにHashMapBeanDefinitionすべての が最初に作成され、(IoC コンテナ内ではなく) 個別に配置されることを明確にする必要がありますBeanPostProcessor。この後、ビジネス ロジックの通常の Bean が作成され、IoC コンテナに配置され、個別に遅延された BPP を使用した構成が開始されます。これがどのようにして起こるかというと、各 BPP には 2 つの方法があります。

postProcessorBeforeInitialization(Object bean, String beanName);
postProcessorAfterInitialization(Object bean, String beanName);
ビンを 2 回繰り返します。メソッドが初めて呼び出されるときpostProcessorBeforeInitialization、およびメソッドが 2 回目に呼び出されるときpostProcessorAfterInitialization。なぜ 2 つの方法が必要なのかという疑問が生じますので、説明しましょう。実際には、いくつかのアノテーション (たとえば@Transactional、 など) を処理するために、Bean はプロキシ クラスに置き換えられます。なぜこれが行われるのかを理解するには、それがどのように機能するかを知る必要があります@Transactional。これがその仕組みです。このアノテーションが付けられたメソッドに、その場でさらに数行のコードを追加する必要があります。どうやってするの?そうです、プロキシ クラスを作成することで、その中で必要なコードが必要なメソッドに追加されます。ここで、次のようなクラスがある状況を想像してください。

class A {
    @Autowired
    private SomeClass someClass;

    @Transactional
    public void method() {
        // модификатор доступа обязательно public
    }
}
このクラスには 2 つのアノテーション@Autowiredと があります@Transactional。どちらのアノテーションも異なる BPP によって処理されます。それが最初に機能する場合AutowiredBPPはすべて問題ありませんが、そうでない場合はこの問題が発生します。実際、プロキシ クラスが作成されると、すべてのメタ情報が失われます。つまり、@Autowiredプロキシ クラスにはアノテーションに関する情報がないため、AutowiredBPP機能しません。つまり、フィールドのsomeClass値は となりnull、NPE が発生する可能性が高くなります。また、メソッド呼び出しの間に、 -method (存在する場合)postProcessorBeforeInitializationpostProcessorAfterInitialization呼び出されることも知っておく価値があります。initこれは基本的に 2 番目のコンストラクターですが、異なる点は、現時点ではすべての依存関係がすでにクラスに埋め込まれており、init-method からそれらにアクセスできることです。したがって、もう一度コンテキスト初期化アルゴリズムを示します。
  1. XmlBeanDefinitionReaderXML 設定ファイルをスキャンします。
  2. を作成しBeanDefinition、 に置きますHashMap
  3. ComeBeanFactoryと from this はHashMap別々にすべての を合計しますBeanPostProcessor
  4. BeanDefinitionから Bean を作成し、IoC コンテナに配置します。
  5. ここで BPP が来て、2 つの方法を使用してこれらの Bean を設定します。
  6. 準備ができて。
実際には、記事が気に入ったかどうか、そしてこのようなチュートリアルを書き続ける価値があるかどうかを書いてください。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION