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 コンポーネントにカプセル化します。
nginx トラフィック制御レート制限は非常に便利ですが、Nginx では誤解され、誤って設定される...
親コンテナの幅は固定されています。子要素が親の幅を均等に分割するには、どのような方法がありますか?コ...
dockerをインストールすると、通常はdockerユーザーグループが作成されます。ステップ2: 現...
プロットレビュー前回の記事では、ロケーション命令の解析プロセスを分析しました。この内容を簡単に確認し...
この記事では、虫眼鏡効果を実現するためのJavaScriptの具体的なコードを参考までに紹介します。...
mysql の存在する例と存在しない例の詳細な説明テーブルA |列1 | 列1 | 列3 |テーブル...
Vue を学習する際に、vscode ターミナルで常に webpack 命令を使用すると、次のよう...
1. IPアドレスを設定する前に、まずifconfigを使用してネットワークカード情報を表示し、ネッ...
目次背景なぜエラー処理が必要なのでしょうか? async await より適切なエラー処理まとめ要約...
乱雑なログ日常的に使用される Nginx は、静的リソース サーバーとリバース プロキシ サーバーの...
Centos7 と Centos6 では、GRUB パスワードの設定手順に大きな違いがあります。これ...
導入:現在、プログラム攻撃を防ぐために、ユーザーがログインまたは登録するときに多くの動的検証テクノロ...
この記事では、チャット機能を簡単に実装するためのVue+Websocketの具体的なコードを参考まで...
1. 概要mysql-monitor MYSQL 監視ツール、最適化ツール、1 つの Java Sp...
目次序文記述子getとsetの詳細な説明オブジェクトの属性の乗っ取りオブジェクトのすべてのプロパティ...