springmvc學習筆記(31)——spring整合spring-Mvc 使用.xml
spring整合springmvc
需要整合嗎?
有的人也許有些疑問,springMvc已經有IOC容器,那麼我們還需要使用spring嗎?對於這個問題,兩種觀點各有道理
觀點一:需要。因為在實際開發中,我們還需要整合hibernate等其他框架,還需要用到事務等,這些需要使用spring來整合配置
觀點二:因為springmvc已經有IOC容器了。。不需要spring =。=
整合後遇到的問題
在web.xml中配置
<!-- 配置啟動 Spring IOC 容器的 Listener --> <!-- needed for ContextLoaderListener --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:beans.xml</param-value> </context-param> <!-- Bootstraps the root web application context before servlet initialization --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listen
在src下建立beans.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <context:component-scan base-package="com.zj"> </context:component-scan> <!-- 配置資料來源, 整合其他框架, 事務等. --> </beans>
為了能夠看到整合後出現的問題,我們現在來寫一個service
package com.zj.service;
import org.springframework.stereotype.Service;
@Service
public class HelloService {
//建構函式
public HelloService(){
System.out.println("hello service");
}
}
在controller中也加上建構函式
package com.zj.controller;
import org.springframework.stereotype.Controller;
@Controller
public class HelloCtrl {
public HelloCtrl(){
System.out.println("hello controller");
}
}
沒錯,由於spring和springmvc都有IOC容器,他們兩都幫我們建立了例項
如何解決這個問題
解決方案一(不推薦)
IOC容器建立哪些例項,取決於我們在配置檔案中配置的掃描的包
<context:component-scan base-package="com.zj">
</context:component-scan>
這個配置在springmvc配置檔案中有,在spring配置檔案中也有。他們有重複的部分,因此例項都建立了兩次。
只要spring和springmvc掃描的包不重合,就能解決這個問題。比如springmvc只掃描controller的包,spring掃描其他的包。
但是這樣有一個缺點。在實際專案中,包的劃分也有可能是按照模組來劃分,而不是所有controller都放在同一個包裡,這種情況下,這個解決方案就不行了。
解決方案二(推薦)
使用include-filter節點和exclude-filter節點來配置只掃描的註解,和不掃描的註解。
在springmvc配置檔案中只掃描@Controller和@ControllerAdvice註解。ControllerAdvice是處理異常的註解,詳情檢視springmvc學習筆記(29)——HandleException處理異常
<!-- 自動掃描的包名 -->
<context:component-scan base-package="com.zj">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
<context:include-filter type="annotation"
expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
</context:component-scan>
spring掃描剩餘所有的註解
<context:component-scan base-package="com.zj">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
<context:exclude-filter type="annotation"
expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
</context:component-scan>
注意,spring中用的是exclude-filter,springmvc配置的是include-filter。兩個長得有點像,別看錯了。