大きな牛の人工知能のチュートリアルを共有します。ゼロベース!わかりやすい!面白くてユーモラス!あなたも人工知能チームに参加してください!http://www.captainbed.netをクリックしてください
Springコンテナの概要
Springが起動すると、アプリケーションによって提供されたBean構成情報を読み取り、対応するBean構成レジストリをSpringコンテナーに生成し、このレジストリに基づいてBeanをインスタンス化し、上位アプリケーションのBean間の依存関係をアセンブルします。準備ができた動作環境。
上の図では、BeanバッファープールはHashMapによって実装されています。
IoCコンテナの概要
Springは、構成ファイルを介してBeanとBeanの間の依存関係を記述し、Beanをインスタンス化し、Java言語のリフレクション関数を使用してBean間の依存関係を確立します。これらの低レベルのタスクの完了に基づいて、SpringのIoCコンテナは、Beanインスタンスのキャッシュ、ライフサイクル管理、Beanインスタンスのプロキシ、イベントの公開、リソースの読み込みなどの高度なサービスも提供します。
- BeanFactoryはSpringフレームワークのインフラストラクチャであり、Spring自体に面しています。
- ApplicationContextは、Springフレームワークを使用する開発者向けです。ほとんどすべてのアプリケーションで、基盤となるBeanFactoryの代わりにApplicationContextを直接使用します。
BeanFactory
BeanFactoryアーキテクチャ:
- BeanDefinitionRegistry:Spring構成ファイルの各<bean>ノード要素は、Beanの構成情報を記述するSpringコンテナー内のBeanDefinitionオブジェクトによって表されます。BeanDefinitionRegistryインターフェースは、BeanDefinitionオブジェクトをコンテナーに手動で登録するメソッドを提供します。
- BeanFactoryインターフェースは、クラス構造ツリーの最上位にあります。そのメインメソッドはgetBean(String beanName)です。このメソッドは、コンテナーから特定の名前のBeanを返します。BeanFactoryの関数は、他のインターフェースを介して継続的に拡張されます。
- ListableBeanFactory:このインターフェースは、Beanの数の確認、特定のタイプのBeanの構成名の取得、特定のBeanがコンテナーに含まれているかどうかの確認など、コンテナー内のBeanの基本情報にアクセスするためのいくつかのメソッドを定義します。
- HierarchicalBeanFactory:親子カスケードIoCコンテナのインターフェイスであり、子コンテナはインターフェイスメソッドを介して親コンテナにアクセスできます。HierarchicalBeanFactoryインターフェイスを介して、SpringのIoCコンテナは親子階層アソシエーションコンテナシステムを確立でき、子コンテナは次のことができます。親コンテナのBeanにアクセスしますが、親コンテナは子コンテナのBeanにアクセスできません。Springは親子コンテナーを使用して多くの機能を実現します。たとえば、Spring MVCでは、プレゼンテーションレイヤーBeanは子コンテナーに配置され、ビジネスレイヤーと永続レイヤーBeanは親コンテナーに配置されます。このように、プレゼンテーション層Beanはビジネス層と永続層Beanを参照できますが、ビジネス層と永続層Beanはプレゼンテーション層Beanを参照できません。
- ConfigurableBeanFactory:IoCコンテナーのカスタマイズ性を強化する重要なインターフェースであり、クラスローダー、プロパティエディター、コンテナー初期化ポストプロセッサーなどを設定するためのメソッドを定義します。
- AutowireCapableBeanFactory:特定のルール(名前による照合、タイプによる照合など)に従ってコンテナ内のBeanを自動的にアセンブルするメソッドを定義します。
- SingletonBeanRegistry:実行時にシングルインスタンスBeanをコンテナに登録できるようにするメソッドを定義します。
例:
Spring構成ファイルを使用して、Carの構成情報を提供します。beans.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="Index of /schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="Index of /schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="car1" class="com.baobaotao.Car"
p:brand="红旗CA72"
p:color="黑色"
p:maxSpeed="200" />
</beans>
BeanFactoryを介して構成ファイルをロードし、SpringIoCコンテナーを開始します。
public class BeanFactoryTest {
public static void main(String[] args) throws Throwable{
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource res = resolver.getResource("classpath:com/baobaotao/beanfactory/beans.xml");
BeanFactory bf = new XmlBeanFactory(res);
System.out.println("init BeanFactory.");
Car car = bf.getBean("car",Car.class);
System.out.println("car bean is ready for use!");
}
- XmlBeanFactoryは、Resourceを介してSpring構成情報をロードし、IoCコンテナーを開始します。その後、BeanFactoryのgetBean(beanName)メソッドを介してIoCコンテナーからBeanを取得できます。IoCコンテナがBeanFactoryを介して開始される場合、構成ファイルで定義されたBeanは初期化されず、初期化アクションは最初の呼び出しで発生します。
- シングルトンBeanの場合、BeanFactoryはBeanインスタンスをキャッシュするため、2回目のgetBean()を使用してBeanを取得すると、IoCコンテナのキャッシュからBeanインスタンスが直接取得されます。Springは、DefaultSingletonBeanRegistryクラスのシングルインスタンスBeanのキャッシュを提供します。これは、HashMapで実装されたキャッシュです。シングルインスタンスBeanは、beanNameをキーとしてこのHashMapに格納されます。
- BeanFactoryを初期化するときは、Log4Jを使用するなど、ロギングフレームワークを提供する必要があります。つまり、Log4J構成ファイルがクラスパスの下に提供されるため、Springコンテナがエラーを報告しないようになります。開始しました。
ApplicationContext
ApplicationContextはBeanFactoryから派生し、より実用的なアプリケーション指向の関数を提供します。
BeanFactoryでは、多くの関数をプログラムで実装する必要がありますが、ApplicationContextでは、構成を通じて実装できます。
ApplicationContextは、HierarchicalBeanFactoryおよびListableBeanFactoryインターフェースを継承します。これに基づいて、他の多くのインターフェースを介してBeanFactoryの機能も拡張します。
- ClassPathXmlApplicationContext:デフォルトでクラスパスから構成ファイルをロードします
- FileSystemXmlApplicationContext:デフォルトでファイルシステムから構成ファイルをロードします
- ApplicationEventPublisher:コンテナーに、コンテナーの起動イベント、シャットダウンイベントなどのアプリケーションコンテキストイベントを公開する機能を持たせます。ApplicationListenerイベント監視インターフェースを実装するBeanは、コンテナーイベントを受信し、イベントに応答できます。ApplicationContext抽象実装クラスAbstractApplicationContextには、コンテナがコンテキストイベントを生成したときに通知できるように、すべてのリスナーを保存するApplicationEventMulticasterがあることがわかります。
- MessageSource:アプリケーションにi18n国際化メッセージアクセスの機能を提供します。
- ResourcePatternResolver:すべてのApplicationContext実装クラスには、PathMatchingResourcePatternResolverと同様の関数が実装されており、Spring構成ファイルは接頭辞付きのAntスタイルのリソースファイルパスを介してロードできます。
- ライフサイクル:このインターフェイスはSpring 2.0によって追加されました。このインターフェイスには、主に非同期処理を制御するために使用されるstart()とstop()の2つのメソッドがあります。特定の用途では、このインターフェースはApplicationContextと特定のBeanの両方によって実装されます。ApplicationContextは、JMXとタスクのスケジューリングを管理および制御する目的を達成するために、このインターフェースを実装するコンテナー内のすべてのBeanに開始/停止情報を渡します。
- ConfigurableApplicationContextはApplicationContextを拡張し、2つの新しいメインメソッドrefresh()とclose()を追加して、ApplicationContextがアプリケーションコンテキストを開始、更新、および閉じることを可能にします。アプリケーションコンテキストが閉じたら、refresh()を呼び出してアプリケーションコンテキストを開始します。すでに開始されている状態で、refresh()を呼び出してキャッシュをクリアし、構成情報を再読み込みし、close()を呼び出してアプリケーションコンテキストを閉じます。これらのインターフェースメソッドは、コンテナーの制御と管理に便利さをもたらしますが、開発者として、これらのメソッドについてあまり気にする必要はありません。
使用する:
構成ファイルがクラスパスに配置されている場合、ユーザーは最初にClassPathXmlApplicationContextを使用してクラスを実装できます。
ApplicationContext ctx = new ClassPathXmlApplicationContext("com/baobaotao/context/beans.xml");
構成ファイルがファイルシステムのパスに配置されている場合は、FileSystemXmlApplicationContext実装クラスの使用を優先できます。
ApplicationContext ctx = new FileSystemXmlApplicationContext("com/baobaotao/context/beans.xml");
Spring 3.0は、クラスアノテーションに基づく構成メソッドをサポートしています。主な機能は、JavaConfigと呼ばれるSpringのサブプロジェクトからのものです。現在、JavaConfigはSpringのコアフレームワークの一部にアップグレードされています。
ApplicationContextは、アプリケーションコンテキストを初期化するときに、すべての単一インスタンスBeanをインスタンス化します。
WebApplicationContext
WebApplicationシステムアーキテクチャ:
WebApplicationContextは、Webアプリケーション用に特別に準備されており、構成ファイルをWebルートディレクトリからの相対パスからロードして、初期化作業を完了することができます。ServletContext参照はWebApplicationContextから取得でき、Webアプリケーション環境がSpringアプリケーションコンテキストにアクセスできるように、Webアプリケーションコンテキストオブジェクト全体がServletContextの属性として配置されます。WebApplicationContextは、定数ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTEを定義します。コンテキストが開始されると、WebApplicationContextインスタンスがこれをキーとしてServletContextの属性リストに配置されるため、次のステートメントを使用してWebコンテナからWebApplicationContextを直接取得できます。
WebApplicationContext wac = (WebApplicationContext)servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
SpringおよびWebアプリケーションのコンテキスト統合:
WebApplicationContextの初期化メソッド:WebApplicationContextには、ServletContextのインスタンスが必要です。これは、Webコンテナがあることを前提としてのみ起動作業を完了できます。自己起動サーブレットを構成するか、web.xmlでWebコンテナーリスナー(ServletContextListener)を定義することができ、これらのいずれかを使用してSpringWebアプリケーションコンテキストを開始できます。Springは、WebApplicationContextを開始するためのサーブレットとWebコンテナリスナーをそれぞれ提供します。
- org.springframework.web.context.ContextLoaderServlet
- org.springframework.web.context.ContextLoaderListener
WebApplicationContextはロギング機能を使用する必要があるため、たとえば、ロギングフレームワークはLog4Jを使用するため、ユーザーはLog4Jの構成ファイルをクラスパスWEB-INF / classesの下に置くことができ、Log4Jエンジンをスムーズに起動できます。Log4J構成ファイルが別の場所に配置されている場合、ユーザーはweb.xmlでLog4J構成ファイルの場所も指定する必要があります。
Beanのライフサイクル
1.1。呼び出し元がgetBean(beanName)を介してコンテナーから特定のBeanを要求するときに、コンテナーがorg.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorインターフェースを登録すると、Beanをインスタンス化する前に、インターフェースのpostProcessBeforeInstantiation()メソッドが呼び出されます。 ;
2.2。構成に応じて、Beanコンストラクターまたはファクトリメソッドを呼び出してBeanをインスタンス化します。
3.3。コンテナーがInstantiationAwareBeanPostProcessorインターフェースを登録している場合、Beanをインスタンス化した後、インターフェースのpostProcessAfterInstantiation()メソッドを呼び出します。ここで、インスタンス化されたオブジェクトを「ドレスアップ」できます。
4.4。Beanがプロパティ情報で構成されている場合、コンテナーはこのステップで構成値をBeanの対応するプロパティに設定しますが、各プロパティを設定する前に、まずInstantiationAwareBeanPostProcessorインターフェースのpostProcessPropertyValues()メソッドを呼び出します。
5.5。Beanの属性設定メソッドを呼び出して、属性値を設定します。
6.6。Beanがorg.springframework.beans.factory.BeanNameAwareインターフェースを実装している場合、setBeanName()インターフェースメソッドが呼び出され、構成ファイル内の対応するBeanの名前がBeanに設定されます。
7。Beanがorg.springframework.beans.factory.BeanFactoryAwareインターフェースを実装している場合、setBeanFactory()インターフェースメソッドが呼び出されて、BeanFactoryコンテナーインスタンスがBeanに設定されます。
8.8。BeanFactoryにorg.springframework.beans.factory.config.BeanPostProcessorポストプロセッサが装備されている場合、BeanFactoryのObject postProcessBeforeInitialization(Object bean、String beanName)インターフェイスメソッドを呼び出してBeanを処理します。入力パラメーターbeanは現在処理中のBeanであり、beanNameは現在のBeanの構成名であり、返されるオブジェクトは処理済みのBeanです。ユーザーはこのメソッドを使用して、特定のBeanで特別な処理を実行したり、Beanの動作を変更したりできます。BeanPostProcessorはSpringフレームワークの重要な位置を占め、コンテナーにBeanの後続の処理のためのエントリポイントを提供します。 Springコンテナの「マジック関数」(AOP、動的プロキシなど)は、BeanPostProcessorを介して実装されます。
9.9。BeanがInitializingBeanインターフェースを実装している場合、インターフェースのafterPropertiesSet()メソッドが呼び出されます。
10.10。初期化メソッドがinit-method属性を介して<bean>で定義されている場合、このメソッドが実行されます。
11.11。BeanPostProcessorポストプロセッサは2つのメソッドを定義します。1つはステップ8で呼び出されるpostProcessBeforeInitialization()であり、もう1つはこの時点で呼び出されるObject postProcessAfterInitialization(Object bean、String beanName)メソッドであり、コンテナはBeanを再度処理します。と
12.12。Beanのスコープが<bean>でscope = "prototype"として指定されている場合、Beanは呼び出し元に返され、呼び出し元はBeanの後続のライフの管理を担当します。Springはライフサイクルを管理しなくなります。豆の。スコープがscope = "singleton"に設定されている場合、BeanをSpring IoCコンテナーのバッファー・プールに入れ、呼び出し元にBean参照を返すと、SpringはこれらのBeanに対して後続のライフ管理を引き続き実行します。
13.13。scope = "singleton"のBeanの場合、コンテナーが閉じられると、SpringはBeanの後続のライフサイクル管理をトリガーします。最初に、BeanがDisposableBeanインターフェースを実装している場合、インターフェースのafterPropertiesSet()メソッドが呼び出されます。ここに書き込み、リリースできます。リソース、ログの記録などの操作。
14.14。scope = "singleton"のBeanの場合、<bean>のdestroy-method属性がBeanの破棄メソッドを指定すると、SpringはBeanのこのメソッドを実行して、Beanリソースの解放およびその他の操作を完了します。
これらの方法は、大きく3つのカテゴリに分類できます。
- Bean独自のメソッド:Beanコンストラクターを呼び出してBeanをインスタンス化する、Setterを呼び出してBeanの属性値を設定する、<bean>のinit-methodおよびdestroy-methodで指定されたメソッドを設定するなど。
- Beanレベルのライフサイクルインターフェイスメソッド:BeanNameAware、BeanFactoryAware、InitializingBean、DisposableBeanなど、これらのインターフェイスメソッドはBeanクラスによって直接実装されます。
- コンテナレベルのライフサイクルインターフェイスメソッド:上の図の「★」の付いたステップは、InstantiationAwareBean PostProcessorおよびBeanPostProcessorインターフェイスによって実装され、それらの実装クラスは一般に「ポストプロセッサ」と呼ばれます。ポストプロセッサインターフェイスは通常、Bean自体によって実装されません。これらはBeanから独立しています。実装クラスは、コンテナアタッチメントの形式でSpringコンテナに登録され、インターフェイスリフレクションを通じてSpringコンテナによって事前に識別されます。SpringコンテナがBeanを作成すると、これらのポストプロセッサが有効になるため、これらのポストプロセッサの影響はグローバルです。もちろん、ユーザーはポストプロセッサーを合理的にプログラムして、目的のBeanのみを処理できるようにすることができます。
ApplicationContextとBeanFactoryのもう1つの最大の違いは、ApplicationContextはJavaリフレクションメカニズムを使用して、構成ファイルで定義されたBeanPostProcessor、InstantiationAwareBeanPostProcessor、およびBeanFactoryPostProcessorを自動的に識別し、それらをアプリケーションコンテキストに自動的に登録します。後者は、コードCallで手動で行う必要があります。登録するaddBeanPostProcessor()メソッド。これが、私たちが一般的にApplicationContextを使用し、アプリケーション開発でBeanFactoryをほとんど使用しない理由の1つです。
IOCコンテナの動作メカニズム
コンテナの起動プロセス
Web環境でのSpringコンテナとSpringMVCコンテナの起動プロセス:
- まず、Webアプリケーションの場合、Webコンテナーにデプロイされ、Webコンテナーはグローバルコンテキスト環境を提供します。このコンテキストはServletContextであり、次の春のIoCコンテナーのホスト環境を提供します。
- 次に、web.xmlにcontextLoaderListener(またはContextLoaderServlet)があります。Webコンテナが起動すると、コンテナ初期化イベントがトリガーされます。このとき、contextLoaderListenerがこのイベントをリッスンし、そのcontextInitializedメソッドが呼び出されます。このメソッドでは、springが起動コンテキストを初期化します。このコンテキストは、ルートコンテキスト、つまりWebApplicationContext。これはインターフェイスクラスです。正確には、実際の実装クラスはXmlWebApplicationContextです。これはSpringIoCコンテナーであり、対応するBean定義の構成は、web.xmlのcontext-paramタグによって指定されます。このIoCコンテナが初期化された後、SpringコンテナはWebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTEを属性Keyとして使用し、簡単にアクセスできるようにServletContextに格納します。
- 繰り返しになりますが、contextLoaderListenerが初期化された後、web.xmlで構成されたサーブレットが初期化されます。このサーブレットは複数で構成できます。最も一般的なDispatcherServletを例として(Spring MVC)、このサーブレットは実際には標準のフロントコントローラーです。各サーブレットリクエストを転送、照合、処理します。DispatcherServletコンテキストが初期化されると、SpringMVC関連のBeanを保持するための独自のIoCコンテキストコンテナが確立されます。このサーブレットが保持するコンテキストのデフォルトの実装クラスもXmlWebApplicationContextです。DispatcherServletの独自のIoCコンテキストを確立する場合、WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTEを使用して、ServletContextから以前のルートコンテキスト(つまり、WebApplicationContext)を独自のコンテキストの親コンテキストとして取得します(つまり、ステップ2で親コンテナーとして初期化されたXmlWebApplicationContext)。この親コンテキストを取得した後、保持しているコンテキストを初期化します(このDispatcherServletは、独自のコンテキストを初期化します。initStrategiesメソッドで確認できます。一般的なジョブは、プロセッサマッピング、ビュー解像度などを初期化することです)。初期化後、Springはサーブレット名に関連する属性(ここでは単にサーブレット名Keyではなく、何らかの変換によって)を属性Keyとして使用し、後で使用するためにサーブレットコンテキストに格納します。このように、各サーブレットは独自のコンテキストを保持します。つまり、独自の独立したBeanスペースを持ち、各サーブレットは同じBean、つまりルートコンテキストによって定義されたBeanを共有します。
Beanのロードプロセス
Springの素晴らしさは、多くのインターフェイスを使用してすべてのデバイスの青写真を描き、Springのフレームワークを構築し、継承システムをレイヤーごとに推論し、継続的に強化し、最後にSpringを肉と血の完全なフレームワークにすることです。 。したがって、Springフレームワークのソースコードを表示すると、2つの明確に見えるコンテキストがあります
。1)インターフェイスレイヤーは、コンテナーの重要なコンポーネントとコンポーネント間の連携関係を記述します
。2)継承システムは徐々に機能を実現します。コンポーネント。
インターフェース層は、Springフレームワークの高レベルの機能の概要を明確に示しており、フレームワークを出現させる準備ができています。インターフェース層の抽象的な記述により、Spring自体が特定の実装を提供できるだけでなく、サードパーティの組織もさまざまな実装を提供できます。Springの完璧なインターフェース層は、フレームワークのスケーラビリティを保証すると言えます。垂直継承システムの段階的な拡張により、フレームワークの機能が段階的に実現されます。この実装スキームにより、フレームワークの機能が特定のクラスに蓄積されてコードロジックの負荷が過剰になり、フレームワークの複雑さが完全に分解されて開かれることがなくなります。
Springコンポーネントは、その役割に応じて2つのカテゴリに分類できます。
1)材料コンポーネント:リソース、BeanDefinition、PropertyEditor、および最終Beanなど。これらは、組立ラインで処理された材料と同様に、処理フローで処理および消費されるコンポーネントです。
- BeanDefinition:Springは、構成ファイル内の<bean>構成情報を、BeanDefinitionを介してコンテナーの内部表現に変換し、これらのBeanDefinitionsをBeanDefinitionRegistryに登録します。Springコンテナの後続の操作は、BeanDefinitionRegistryから構成情報を直接読み取ります。
2)処理装置コンポーネント:ResourceLoader、BeanDefinitionReader、BeanFactoryPostProcessor、InstantiationStrategy、BeanWrapperなどのコンポーネントは、材料コンポーネントを処理するための組立ラインのさまざまなリンクにある処理装置です。
- InstantiationStrategy:Java言語のnewの機能と同等の、Bean操作のインスタンス化を担当し、Beanプロパティの構成には参加しません。属性の入力作業は、BeanWrapperの完了に任されています。
- BeanWrapper:PropertyAccessorおよびPropertyEditorRegistryインターフェースを継承します。BeanWrapperImplは、次の2種類のコンポーネントをカプセル化します。(1)カプセル化されたターゲットBean(2)Beanプロパティを設定するためのプロパティエディターのセット。トリプルIDを持ちます。(1)Beanラッパー(2)プロパティアクセサー(3)プロパティエディターレジストリ。PropertyAccessor:Beanプロパティにアクセスするためのさまざまなメソッドを定義します。PropertyEditorRegistry:プロパティエディターのレジストリ。
この図は、構成ファイルのロードから完全なBeanワークフローの作成までのSpringコンテナーを示しています。
1. ResourceLoaderは、記憶媒体からSpring構成情報をロードし、Resourceを使用してこの構成ファイルのリソースを表します。
2. BeanDefinitionReaderは、Resourceが指す構成ファイルリソースを読み取り、構成ファイルを解析します。構成ファイル内の各<bean>は、BeanDefinitionオブジェクトに解析され、BeanDefinitionRegistryに保存されます。
3.コンテナはBeanDefinitionRegistryでBeanDefinitionをスキャンし、Javaのリフレクションメカニズムを使用してBeanファクトリ後処理プロセッサのBeanを自動的に識別し(BeanFactoryPostProcessorインターフェイスを実装)、これらのBeanファクトリポストプロセッサを呼び出してBeanDefinitionを処理します。 BeanDefinitionRegistry。主に次の2つのタスクを完了します。
- 1)プレースホルダーを使用する<bean>要素タグを分析して最終的な構成値を取得します。これは、いくつかの半完成のBeanDefinitionオブジェクトが処理され、完成したBeanDefinitionオブジェクトが取得されることを意味します。
- 2)BeanDefinitionRegistryでBeanDefinitionをスキャンし、Javaリフレクションメカニズムを介してプロパティエディターのすべてのBean(java.beans.PropertyEditorインターフェイスを実装するBean)を見つけ、Springコンテナーのプロパティエディターレジストリに自動的に登録します( PropertyEditorRegistry);
4.4。Springコンテナは処理されたBeanDefinitionをBeanDefinitionRegistryから取り出し、InstantiationStrategyを呼び出してBeanのインスタンス化の作業を開始します。
5.5。Beanをインスタンス化するとき、SpringコンテナはBeanWrapperを使用してBeanをカプセル化します。BeanWrapperは、Javaリフレクションメカニズムを使用してBeanを操作するための多くのメソッドを提供します。これは、BeanのBeanDefinitionとコンテナ内のプロパティエディタを組み合わせて設定を完了します。 Beanプロパティの;
6.6。コンテナに登録されているBeanポストプロセッサ(BeanPostProcessorインターフェイスを実装するBean)を使用して、プロパティ設定作業を完了したBeanで後続の処理を実行し、準備ができたBeanを直接アセンブルします。
総括する
- Spring IOCコンテナーには、主に継承システムの下部にBeanFactory、高レベルのApplicationContextおよびWebApplicationContextがあります。
- Beanには独自のライフサイクルがあります
- コンテナの起動原理: SpringアプリケーションのIOCコンテナは、Tomcatサーブレットまたはリスナーの監視を通じて起動およびロードされます。SpringMVCコンテナは、DispatchServletによって入口としてロードされます。Springコンテナは、SpringMVCコンテナの親コンテナです。
- Beanをロードするコンテナの原則:
- BeanDefinitionReaderは、Resourceが指す構成ファイルリソースを読み取り、構成ファイルを解析します。構成ファイル内の各<bean>は、BeanDefinitionオブジェクトに解析され、BeanDefinitionRegistryに保存されます。
- コンテナはBeanDefinitionRegistry内のBeanDefinitionをスキャンし、InstantiationStrategyを呼び出してBeanをインスタンス化し、BeanWrapperを使用してBeanプロパティの設定を完了します。
- シングルトンBeanキャッシュプール:Springは、DefaultSingletonBeanRegistryクラスのシングルインスタンスBeanのキャッシュを提供します。これは、HashMapで実装されたキャッシュです。シングルインスタンスBeanは、beanNameをキーとしてこのHashMapに格納されます。