Springmvc整合Spring(十)

来源:互联网 发布:大连淘宝职位招聘网 编辑:程序博客网 时间:2024/06/07 14:17

SpringMVC是Spring的一部分,那么需要整合吗?

1. 需要

通常情况下, 类似于数据源, 事务, 整合其他框架都是放在 Spring 的配置文件中(而不是放在 SpringMVC 的配置文件中)。实际上放入 Spring 配置文件对应的 IOC 容器中的还有 Service 和 Dao。

问题: 若 Spring 的 IOC 容器和 SpringMVC 的 IOC 容器扫描的包有重合的部分, 就会导致有的 bean 会被创建 2 次。

解决:
1. 使 Spring 的 IOC 容器扫描的包和 SpringMVC 的 IOC 容器扫描的包没有重合的部分。
2. 使用 exclude-filter 和 include-filter 子节点来规定只能扫描的注解。

web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns="http://java.sun.com/xml/ns/javaee"    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"    id="WebApp_ID" version="2.5">    <!-- 配置启动 Spring IOC 容器的 Listener -->    <!-- needed for ContextLoaderListener -->    <context-param>        <param-name>contextConfigLocation</param-name>        <param-value>classpath:beans.xml</param-value>    </context-param>    <listener>        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>    </listener>    <servlet>        <servlet-name>springDispatcherServlet</servlet-name>        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>        <init-param>            <param-name>contextConfigLocation</param-name>            <param-value>classpath:springmvc.xml</param-value>        </init-param>        <load-on-startup>1</load-on-startup>    </servlet>    <servlet-mapping>        <servlet-name>springDispatcherServlet</servlet-name>        <url-pattern>/</url-pattern>    </servlet-mapping></web-app>

springmvc.xml

<!--      SpringMVC 的 IOC 容器中的 bean 可以来引用 Spring IOC 容器中的 bean.     返回来呢 ? 反之则不行. Spring IOC 容器中的 bean 却不能来引用 SpringMVC IOC 容器中的 bean!--><context:component-scan base-package="com.atguigu.springmvc" use-default-filters="false">    <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.xml

<context:component-scan base-package="com.atguigu.springmvc">    <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><!-- 配置数据源, 整合其他框架, 事务等. -->

2. 不需要

都放在 SpringMVC 的配置文件中. 也可以分多个 Spring 的配置文件, 然后使用 import 节点导入其他的配置文件。

:多个Spring IOC容器之间可以设置父子关系,以实现良好的解耦。所以这里的Spring MVC WEB容器可以看做Spring IOC容器的一个子容器,子容器可以访问到父容器中的 Bean,但是父容器访问不到子容器中的 Bean。