spring與springMVC的配置問題

弄了這麼久spring和springMVC一直以爲這兩個配置出來的對象是一致的,隨便進行搭配,後來發現原來還是不一致的。

springmvc和spring會分別創建一個IOC容器,那麼我們在進行掃描的時候就要注意,下面我們將整個訪問流程,進行一個梳理,

一般情況下,controller是由我們springMVC進行管理,service和dao是由spring進行管理。

一般我們將spring稱之爲父容器,springmvc成做子容器。

父容器是由listener創建的,而自容器是由servlet進行創建的,所以父容器要比子容器創建的早。

父容器和子容器在尋找對象時,會先從自己的容器中查詢,如果沒有再從別人的容器中查找,所以父容器和子容器不能同時管理同一個對象,如果SpringMVC中有service對象而spring中也有service對象,而把事務對象分配到spring來管理,那麼springmvc中執行service的對象就會沒有事務管理。

所以,在我們進行配置的時候要麼對象全部交給springMVC來管理,要麼就分開清除進行管理,現在我們看看分開管理和一起管理的區別,首先一起管理時springmvc的服務如何配置:

    <servlet>
        <servlet-name>atguigu</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/springmvc.xml,classpath:spring/applicationContext-*.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>atguigu</servlet-name>
		<url-pattern>*.htm</url-pattern> <!-- 表示只調整頁面,不調用業務層 -->
		<url-pattern>*.do</url-pattern> <!-- 表示調用業務層 調用了這個以後,可以不用配置靜態資源處理器 -->
    </servlet-mapping>

主要看param-value 這裏param已經是掃描了我們所有的文件了,也就是這裏所有的對象全部都交給springmvc來進行管理了。這種寫法比較簡單,但是分工不夠明確。

第二種分開寫。

	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring/springmvc-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>*.htm</url-pattern> <!-- 表示只調整頁面,不調用業務層 -->
		<url-pattern>*.do</url-pattern> <!-- 表示調用業務層 -->
	</servlet-mapping>

這裏springmvc就只加載自己那部分的對象即可,spring的另外配置如下

	<!-- 應用上下文參數 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath*:spring/spring-*.xml</param-value>
	</context-param>

	<!-- 監聽器:
		在服務器啓動時,監聽 ServletContext對象創建,去創建IOC容器對象。
		將IOC容器對象存放到application域中。
		ApplicationContext ioc = WebApplicationContextUtils.getWebApplicationContext(application);
	 -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

只加載配置spring自己的配置文件。當然這還沒完,重點是在配置文件中,你掃描的部分是不是隻是包含你自己的那一部分。

那麼在springmvc-context中配置掃描爲:

    <!-- 掃描包:只管理Controller對象的生命週期。 -->
    <context:component-scan base-package="com.atguigu.atcrowdfunding.*" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

其中use-default-filters屬性爲是否使用默認過濾器掃描,默認的會掃描@controller @service @Repository等註解,我們設置爲false就全部都不掃描,然後配置一個只掃描controller註解的。

同理,在spring-context中的掃描包配置爲包括所有的Controller除去Controller

	<context:component-scan base-package="com.atguigu.atcrowdfunding.*">
		<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
	</context:component-scan>

匹配除去@controller的註解即可。

 

總結:其實不管你怎麼配置,只要你把包都掃描到了,他一定不會報錯,不過就是說,我們的事務配置必須要和service配置在同一個容器中罷了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章