Springの統合時にサービス層がグローバルパッケージスキャンをしない理由の詳細

9315 ワード

http://blog.csdn.net/s740556472/article/details/54879954
Springの統合時にサービス層がグローバルパッケージスキャンをしない理由の詳細
一、SpringとSpringMVCの親子容器関係
1.問題を話す前に関係を理解する
一般的に、SpringとSpringMVCの2つのフレームワークを統合しています.xmlは次のように書きます.
  
  
  <context-param>
    <param-name>contextConfigLocationparam-name>
    <param-value>classpath:spring/application-*.xmlparam-value>
  context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
  listener>

  
  <servlet>
    <servlet-name>taotao-managerservlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
    
    <init-param>
        <param-name>contextConfigLocationparam-name>
        <param-value>classpath:spring/springmvc.xmlparam-value>
    init-param>
    <load-on-startup>1load-on-startup>
  servlet>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
まずSpringコンテナの初期化でロードされたアプリケーションファイルを構成し、SpringMVCのフロントエンドコントローラ(DispatchService)を構成します.DispatchServiceを構成するとSpringコンテナに新しいコンテナが作成されます.実はこれは2つの容器で、Springは親容器、SpringMVCは子容器です.この親子関係の原理を図で見てみましょう
这里写图片描述
通常、プロジェクトに関係を注入する順序は、サービスにDao(自動注入を初期化し、@Autowiredを利用)を注入し、Controllerにサービス(自動注入を初期化し、@Autowiredを利用)を注入します.図を見ると、SpringMVCのサブコンテナとして親コンテナSpringオブジェクトにアクセスできることを意味します.
では皆さんに質問です.逆に言えば、あなたはControlをサービスに注入してもいいですか?きっとだめだよ.(図のように、親コンテナはサブコンテナオブジェクトを呼び出すことができません)
もしDao,Serive,ControllerがSpring容器の中にいたら、間違いなく上の問題は肯定的で、すべて1つのbeanの中で、1つの容器の中にあるからです.
2.質問:SpringのServiceレイヤでグローバルスキャンを構成できない理由例えば、あるプロジェクトの私の総プロジェクトの名前はcomです.shop、アプリケーションContext-serviceを構成しています.xmlでは、パケットスキャンコードは次のとおりです.

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context" 
    ...../     >

    
    <context:component-scan base-package="com.shop.service">context:component-scan>
beans>

1
2
3
4
5
6
7
8
上記の構成は、グローバルスキャンではなくローカルスキャンです.次に理由を説明します.ここでは、上記の親子コンテナと関係があります.グローバルスキャンを行ったとします.コードは次のとおりです.

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context" 
    ...../     >

    
    <context:component-scan base-package="com.shop">context:component-scan>
beans>

1
2
3
4
5
6
7
8
9
このときSpringコンテナでは@Controller,@Service,@Reposity,@Componentがスキャンされますが、この場合の図は以下の通りです.
这里写图片描述図を見てみると、いずれも大きなコンテナに入れられることに相当するが、このときのSpringMVCコンテナにはオブジェクトがなく、オブジェクトがなければControllerがないため、プロセッサをロードし、アダプタのときにマッピングオブジェクトが見つからず、マッピング関係が見つからないため、ページに404のエラーが発生する.
3.Spring容器を使わない場合、直接すべての層をSpringMVC容器に入れてもいいですか?
もちろんいいです.Spring容器がなければ、私たちはすべての層をSpringMVCに入れることができます.この容器を単独で使うのは完全に可能で、軽量級です.
4.では、なぜプロジェクトでSpringコンテナとSpringMVCコンテナを併用するのでしょうか.Springの拡張性は、プロジェクトにStrutsなどを組み込む必要がある場合に統合でき、フレームワークを拡張しやすい.早いためなら、開発しやすいようにSpringMVCフレームワークを使うことができます.
5.結論:プロジェクトでサービス層でグローバルパッケージスキャンを行うと、springmvcサブコンテナにcontrollerオブジェクトがないため、springmvcはサービスを提供できません.