2019獨角獸企業重金招聘Python工程師標準>>>
在Spring MVC的啟動依賴Spring框架,有時候我們在啟動Spring MVC環境的時候,如果配置不當的話會造成一些不可預知的結果。下面主要介紹一下Spring MVC環境啟動的時候context的狀態。
通常情況下使用Spring MVC需要進行如下配置:
1、web.xml中增加監聽和dispatcherServlet入口
?
<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
<servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath*:config/dispatcher-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
如上配置所示:監聽器是裝載Spring框架本身的bean上下文(如Service和DAO層等);dispatcherServlet是裝載Controller的上下文。
2、監聽器入口自動掃描配置(applicationContext.xml)
?
<aop:aspectj-autoproxy proxy-target-class="true" /><context:component-scan base-package="com.moguhu"><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /></context:component-scan><import resource="classpath*:beans-*.xml" /><import resource="classpath*:config/beans-*.xml" />
上述的配置指定了Spring框架所掃描的注解不包括@Controller(也可以直接通過包名來指定),當然其他的配置文件(如:事務配置、AOP配置、定時任務等)可以通過<import />引入進來。
3、DispatcherServlet配置(dispatcher-servlet.xml)
?
<context:component-scan base-package="com.moguhu.controller.*" />
上面配置是指定了DispatcherServlet所創建的上下文只掃描控制層的beans,當然在dispatcher-servlet.xml中還可以指定視圖解析、JSON轉換、上傳下載等配置信息。
在上面的配置中,listener會創建Spring MVC環境的父類上下文。父類上下文創建完成之后,當初始化DispatcherServlet的時候,就會將之前初始化的context設置為parent。
如果將listener啟動的上下文和Dispatcher中啟動的上下文所掃描的包都是全部包的話,就會造成在子類context和父類context都有全部的自定義beans,如下圖所示
在 容器啟動后獲取bean的時候,也是先從子類容器中去獲取bean,子類獲取不到時,再到父類容器中去尋找。當子類容器中裝載了Service和DAO 時,控制層就會使用子類容器所裝載的bean去執行。但是這里面的service是沒有事務等功能的(沒有Spring框架的配置),只是普通的 bean,因此使用起來會有不可預知的問題。
?
http://m.ithao123.cn/content-8711958.html