springmvc による Spring の統合
Spring にロードされる Bean 定義は、org.springframework.context.ConfigurableApplicationContext#refresh メソッドの ConfigurableListableBeanFactory beanFactory = acquireFreshBeanFactory() メソッドによってロードされます。次に、このメソッドは org.springframework.context.support.AbstractRefreshableApplicationContext#refreshBeanFactory メソッドを呼び出して、Bean ファクトリを作成し、Bean 定義をロードします。 <?xml バージョン="1.0" エンコーディング="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" java.sun.com の xmlns ディレクトリに javaee.xml というファイルがあります。 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" バージョン="3.0"> <display-name>アーキタイプで作成された Web アプリケーション</display-name> <リスナー> <リスナークラス>org.springframework.web.context.ContextLoaderListener</リスナークラス> </リスナー> <!-- スプリング コンテナをロードします --> <コンテキストパラメータ> <param-name>コンテキスト構成の場所</param-name> <param-value>クラスパス:spring/applicationContext-*.xml</param-value> </コンテキストパラメータ> <サーブレット> <サーブレット名>mvc-ディスパッチャ</サーブレット名> <サーブレットクラス>org.springframework.web.servlet.DispatcherServlet</サーブレットクラス> <!-- springMVC がロードする必要がある構成ファイルを設定します--> <初期化パラメータ> <param-name>コンテキスト構成の場所</param-name> <param-value>クラスパス:spring/spring-*.xml</param-value> </init-param> </サーブレット> <サーブレットマッピング> <サーブレット名>mvc-ディスパッチャ</サーブレット名> <!-- デフォルトではすべてのリクエストに一致します --> <url-パターン>/</url-パターン> </サーブレットマッピング> </ウェブアプリ> tomcat コンテナが起動し、パスを介してリソースにアクセスすると、初めて org.springframework.web.servlet.HttpServletBean#init メソッドが呼び出され、その後の http リクエストではこのメソッド クラスは使用されなくなります。HttpServletBean は Servlet インターフェースの仕様を実装しているため、ブラウザ リクエストが初期化され、サーブレット インターフェースを介して実行されると、springmvc 構成で定義されたロード クラスが spring コンテナからロードされます。Spring と springmvc は親子コンテナです。以下は HttpServletBean の init メソッドです。 パブリックファイナルボイドinit()はServletExceptionをスローします{ // 初期パラメータから Bean プロパティを設定します。 PropertyValues pvs = new ServletConfigPropertyValues(getServletConfig(), this.requiredProperties); 空の場合(!pvs.isEmpty()){ 試す { BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this); リソースローダー resourceLoader = 新しい ServletContextResourceLoader(getServletContext()); bw.registerCustomEditor(Resource.class、新しいResourceEditor(resourceLoader、getEnvironment())); initBeanWrapper(bw); bw.setPropertyValues(pvs, true); } catch (BeansException ex) { ロガーがエラーを有効としている場合 logger.error("サーブレット '" + getServletName() + "'" の Bean プロパティの設定に失敗しました、例); } 投げる例; } } //最後に、org.springframework.context.ConfigurableApplicationContext#refresh コンテナの refresh メソッドが呼び出されます。 // springmvc コンテナを初期化します initServletBean(); } } Springbootがコンテナを起動する
org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcessors メソッドでは、Bean 定義の処理を可能にする BeanDefinitionRegistryPostProcessor インターフェースを実装する ConfigurationClassPostProcessor クラスを通じて Bean 定義がロードされます。 // Spring の BeanDefinitionRegistryPostProcessor は、BeanFactoryPostProcessor のサブインターフェースです。 // BeanFactoryPostProcessor の機能は、Bean 定義情報がロードされたが初期化されていない場合に postProcessBeanFactory() メソッドを実行することです。 // BeanDefinitionRegistryPostProcessor は、BeanFactoryPostProcessor の前に実行されます。実行順序はソース コードで定義されています // org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors() メソッド // BeanFactoryPostProcessor は、Bean ファクトリの Bean プロパティ処理コンテナです。簡単に言えば、Bean ファクトリ内のすべての beandefinition (インスタンス化されていない) データを管理し、プロパティを自由に変更できます。 パブリック void refresh() は BeansException、IllegalStateException をスローします { 同期 (this.startupShutdownMonitor) { リフレッシュを準備します。 // Bean ファクトリを取得してサブクラスに指示し、Bean をキャッシュにロードします。Spring Spring MVC 統合では、ここで Bean を初期化します。ConfigurableListableBeanFactory beanFactory = getFreshBeanFactory(); BeanFactory を準備します。 試す { BeanFactory を postProcess します。 // この時点で Springboot コンテナのロードが開始され、次の Bean 名が初期化されます。 //0 = "org.springframework.context.annotation.internalConfigurationAnnotationProcessor" =》対応する ConfigurationClassPostProcessor クラス //1 = "org.springframework.context.annotation.internalAutowiredAnnotationProcessor" =》AutowiredAnnotationBeanPostProcessor //2 = "org.springframework.context.annotation.internalCommonAnnotationProcessor" =》CommonAnnotationBeanPostProcessor //3 = "org.springframework.context.event.internalEventListenerProcessor" =》EventListenerMethodProcessor //4 = "org.springframework.context.event.internalEventListenerFactory" = "DefaultEventListenerFactory // Bean ファクトリのポストプロセッサを呼び出します。Bean 定義 (インスタンス化ではない) をロードし、ConfigurationClassPostProcessor を介してスタートアップ クラスのスキャン パスをロードします // 次に、Bean へのパスをロードします。invokeBeanFactoryPostProcessors(beanFactory); BeanPostProcessors を登録します (beanFactory); メッセージソースを初期化します。 アプリケーションイベントマルチキャスターを初期化します。 // このメソッドは Springboot のサブクラスによっても実装されており、このメソッドからトマトも開始されます。 リフレッシュ(); リスナーを登録します。 // 残りのシングルトン Bean をインスタンス化します。 beanFactory の初期化を終了します。 // 最後に、コンテナはリフレッシュしてリフレッシュイベントを発行します(Spring Cloudもここから起動されます) リフレッシュを終了します。 } catch (BeansException ex) { ロガーが警告を有効にするかどうか logger.warn("コンテキストの初期化中に例外が発生しました - " + "更新の試行をキャンセルしています: " + ex); } // 未処理のリソースを回避するために、すでに作成されたシングルトンを破棄します。 Bean を破棄します。 // 「アクティブ」フラグをリセットします。 リフレッシュをキャンセルします(例); // 例外を呼び出し元に伝播します。 投げる例; } ついに { // Springのコアにある共通のイントロスペクションキャッシュをリセットします。 // シングルトン Bean のメタデータは今後必要なくなるかもしれません... 共通キャッシュをリセットします。 } } } 従来のTomcatスタートアップサービスとSpringbootスタートアップ組み込みTomcatサービスの違いに関するこの記事はこれで終わりです。TomcatスタートアップサービスとSpringbootスタートアップ組み込みTomcatサービスの違いの詳細については、123WORDPRESS.COMの以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも123WORDPRESS.COMをよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: CSS に基づいて MaterialUI ボタンクリックアニメーションを実装し、それを React コンポーネントにカプセル化します。
この記事では、MySQL 8.0.15 winx64解凍版のインストールと設定方法を紹介します。具体...
導入EXISTS は、サブクエリが少なくとも 1 行のデータを返すかどうかを確認するために使用されま...
1. 要件Vue.js フレームワークを使用してフロントエンド プロジェクトを開発する場合、サーバ...
まずMySQLにログインする シェル> mysql --user=root mysqlパスワー...
脆弱性の紹介SigRed の脆弱性はワーム化可能であるため非常に危険です。つまり、ユーザーの介入なし...
ウェブサイトでは、コンテンツの(100-1)%がナビゲーションです1. ジェシー・ジェームズ・ギャレ...
この記事では、参考までに、シンプルな広告ウィンドウを実装するためのjsの具体的なコードを紹介します。...
目次インストール構成よくある間違い事前テスト作業依存関係の扱いインスタンスとDOMを生成する要約する...
MySQL Select ステートメントはどのように実行されますか?最近、Geek Time で D...
google.htmlインターフェースは図の通りですコードは図のとおりです: (比較的シンプルで、入...
目次1. 補助機能2. 例1. mapState と mapGetters 2. mapMutati...
Tomcat の上位バージョンでは、デフォルト モードは NIO モードを使用することになります。...
前面に書かれたLinux を使用する際にソフトウェアをインストールする必要がある場合があります。もち...
nginx の概要nginx は、無料のオープンソースの高性能 HTTP サーバーおよびリバース プ...
新年の初めに、友人の健康と2013年が素晴らしい年となることを心からお祈りいたします。この記事では、...