1. 程式人生 > >springmvc學習筆記(31)——spring整合spring-Mvc 使用.xml

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。兩個長得有點像,別看錯了。