1。背景
最近、プロジェクトのパッケージスキャンの問題により、問題を解決する過程で、SpringとSpringMVCが親子のコンテナ関係を持っていることを誤って発見しました。ここでは、SpringとSpringMVCの親子コンテナ関係を分析して理解し、SpringおよびSpringMVC構成ファイルでの公式推奨パッケージスキャンの方法を提供します。
2。基礎を築く概念の理解と知識
Springの全体的なフレームワークのコアコンセプトでは、コンテナがコアアイデアであり、豆のライフサイクル全体を管理するために使用されます。プロジェクトでは、必ずしも1つのコンテナだけではありません。スプリングには複数のコンテナを含めることができ、容器には上下のレベルがあります。現在最も一般的なシナリオは、プロジェクトでSpringとSpringMVCの2つのフレームワークを導入することです。その後、実際には2つのコンテナです。 Springは親の容器であり、SpringMVCはその子容器です。 Spring Parent Containerに登録されているBeanはSpringMVCコンテナに表示されますが、SpringMVCコンテナに登録されているBeanはSpring Parent Containerには見えません。つまり、子容器は親コンテナに登録された豆を見ることができます。
XMLを使用して各豆を個別に構成することなく、次のように統一アノテーション構成を次のように使用して、豆をバッチ登録することができます。
<コンテキスト:component-scanベースパッケージ= "com.hafiz.www" />
Springが提供するリファレンスマニュアルから、この構成の機能は、@Componentアノテーションを使用する構成されたベースパッケージパッケージの下ですべてのクラスをスキャンし、コンテナに自動的に登録することであることがわかります。同時に、@Componentから継承されているため、@Controller、@Service、および@Respositoryの3つの注釈もスキャンします。
プロジェクトでは、しばしば次の構成が表示されます。実際、上記の構成がデフォルトで次の構成をオンにするため、上記の構成では省略できます。次の構成では、 @Required、 @autowired、@postconstruct、@persistenceContext、@Resource、@predestroyなどの注釈を宣言します。デフォルトで。
<コンテキスト:annotation-config/>
さらに、SpringMVCに関連する別の構成があります。確認後、これは@RequestMapping、@RequestBody、@responseBodyなどを宣言するため、SpringMVC用に構成する必要があります。さらに、この構成は、JSON変換パーサーなどのデフォルトで多くのパラメーターバインディングメソッドをロードします。
<MVC:Annotation-driven />
春3.1の前の上記の文構成バージョンは、次の構成方法と同等です
<! - Annotation Controller Mapperを構成し、SpringMVCで使用されてリクエストリクエストURLを特定のコントローラーにマッピングします - > <Bean/> <! - Annotation Controller Mapperを構成し、SpringMVCで特定のリクエストを特定の方法にマッピングするために使用されます - > <Bean/>
spring3.1以降のバージョンは、次の構成方法に相当します
<! - Annotation Controller Mapperを構成し、SpringMVCで使用されてリクエストリクエストURLを特定のコントローラーにマッピングします - > <Bean/> <! - Annotation Controller Mapperを構成し、SpringMVCで特定のリクエストを特定の方法にマッピングするために使用されます - > <Bean/>
3。特定のシナリオ分析
SpringとSpringMVCの間のコンテナの競合の原因を詳しく見てみましょう。
SpringとSpringMVCの2つのコンテナがあり、その構成ファイルはそれぞれApplicationContext.xmlとApplicationContext-Mvc.xmlです。
1。<コンテキスト:Component-ScanScanベースパッケージ= "com.hafiz.www" />は、ApplicationContext.xmlで構成されており、登録する必要があるすべての豆のスキャンと登録を担当します。
2。springMVC関連のアノテーションの使用を担当するように、<MVC:Annotation-driven />をApplicationContext-Mvc.xmlの構成。
3.プロジェクトを開始すると、SpringMVCがジャンプできないことがわかりました。ログのログ印刷レベルを設定して、デバッグするためにデバッグします。 SpringMVCコンテナのリクエストは、特定のコントローラーにマッピングされていないようです。
4。configure <context:component-scanベースパッケージ= "com.hafiz.www" /> in applicationContext-mvc.xml。再起動後、検証が成功し、SpringMVCジャンプが有効です。
特定の理由を確認し、ソースコードを見て、SpringMVCのDispatcherServletから開始して検索します。 SpringMVCが初期化されると、@Controllerアノテーションを使用してハンドラーであるかどうかを判断するSpringMVCコンテナ内のすべての豆を探します。 1と2の2段階の構成により、現在のSpringMVCコンテナは@Controller AnnotationにBeanを登録しませんが、@Controller AnnotationのあるすべてのBeanはSpringの親コンテナに登録されているため、SpringMVCはプロセッサを見つけることができず、ジャンプできません。コアソースコードは次のとおりです。
保護されたvoid inithandlermethods(){if(logger.isdebugenabled()){logger.debug( "アプリケーションコンテキストでリクエストマッピングを探しています:" + getApplicationContext()); } string [] beannames =(the.tectectectectecthandlermethodsinanceStorcontexts?beanfactutils.beannamesfortypeincludedanceStors(getApplicationContext()、object.class):getApplicationContext()。 for(string beanname:beannames){if(ishandler(getApplicationContext()。getType(beanname))){detectecthandlermethods(beanname); }} handlermethodsInitialized(gethandlermethods());}メソッドishandlerでは、現在の豆の注釈がコントローラーであるかどうかを判断します。ソースコードは次のとおりです。
保護されたブールishandler(class <?> beantype){return annotationutils.findannotation(beantype、controller.class)!= null;}4番目のステップ構成では、@Controllerアノテーションを備えたすべての豆もSpringMVCコンテナに登録されているため、SpringMVCは処理用のプロセッサを見つけることができるため、正常にジャンプします。
正しくジャンプできない理由が見つかったので、その解決策は何ですか?
Inithandlermethods()メソッド、Detectectectectectectectectectectectectectectectectectectectedlermethodsinancestorcontextsスイッチでは、主に容器内の豆が取得され、親コンテナが含まれているかどうかを制御することに気付きました。デフォルトでは含まれていません。そのため、ソリューションは、SpringMVC構成ファイルでTrueにHandLermappのプロパティを検出することです(ここでは、特定のプロジェクトに従ってどのタイプのハンドライングが使用されているかを確認する必要があります)。次のように:
<bean> <プロパティ名= "detectectecthandlermethodsinancestorcontexts"> <balue> true </value> </property> </bean>
ただし、実際のプロジェクトでは、多くの構成があります。異なるビジネスモジュールに従って、公式の推奨事項に従って異なるタイプの豆を異なる容器に分割します。Spring親コンテナは、@Controllerによって注釈が付けられていない他のすべての豆の登録を担当しますが、SpringMVCは@Controllerによって注釈が付けられた豆の登録のみを担当しているため、それぞれが独自の責任と境界境界を促進します。構成方法は次のとおりです
1.アプリケーションContext.xmlの構成:
<! - @controllerによって注釈が付けられていないスプリングコンテナに豆を登録 - > <コンテキスト:コンポーネント-scanベースパッケージ= "com.hafiz.www"> <context:explude-filter type = "annotation" expression = "
2.アプリケーションContext-Mvc.xmlの構成
<! - @Controllerアノテーションを備えた豆のみがSpringMVCコンテナに登録されています - > <コンテキスト:Component-ScanSycanベースパッケージ= "com.hafiz.www" use-default-filters = "false"> <context = "annotation" expression = "org.springframework.steretype.controller" /<
3。概要
このようにして、SpringとSpringMVCの間の親子のコンテナ関係とスキャンと登録の原則を理解した後、公式の提案によると、管理のためにさまざまな種類の豆を異なる容器に割り当てることができます。 Beanが見つからないなどの問題がある場合、SpringMVCをリダイレクトできず、トランザクション構成が失敗すると、問題をすぐに見つけて解決できます。とても幸せです、何か〜
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。