spring 和 springmvc 容器關係父子關係

spring 和 springmvc 容器關係父子關係圖


ContextLoaderListener 初始化的上下文和 DispatcherServlet初始化的上下文關係如下:


spring 和 springmvc 容器關係父子關係

ContextLoaderListener 初始化的上下文加載的Bean是對於整個應用程序共享的,不管是使用什麼表現層技術,一般如DAO層、Service層Bean;

DispatcherServlet初始化的上下文加載的Bean是隻對Spring Web MVC有效的Bean,如Controller、HandlerMapping、HandlerAdapter等等,該初始化上下文應該只加載Web相關組件。

訪問規則:子容器可以訪問父容器的對象,父容器不可以訪問子容器的對象。

如果子容器加載了service 、dao ,則controller調用service的時候,會調用子容器中的service,但是service 的事務事務是在父容器中設置,所以會導致事務失效。子容器和父容器的功能一樣的。


為什麼要有兩個容器??

DispatcherServlet表現層框架,而spring和其他框架也可以整合,Spring擴展性比較好;

<code>xml中通過配置<component-scan> ;

<component-scan>提供了2個子標籤

<include-filter>

<exclude-filter>

<component-scan>如果只想掃描controller,/<component-scan>/<exclude-filter>/<include-filter>/<component-scan>/<code>

如果只想掃描controller

<code><component-scan>  
<include-filter>
/<component-scan> /<code>

use-default-filter="true":對base-package 包或者子包下的所有@component 或者子類@Service @Reposity 等註冊為bean

如果是下面:


<code><component-scan>  
<include-filter>
/<component-scan> /<code>

上面的代碼會掃描Controller 、service等下面類或者子類。

出現上面的問題時因為 <include-filter>沒有起作用,如果要起作用只需把:use-default-filter=false;/<include-filter>

所以如果想要 <include-filter> <exclude-filter> 這兩個起作用,use-default-filter必須設為false./<exclude-filter>/<include-filter>


分享到:


相關文章: