SpringMVC系列(十五)Spring MVC与Spring整合时实例被创建两次的解决方案以及Spring 的 IOC 容器和 SpringMVC 的 IOC 容器的关系
一、Spring MVC与Spring整合时实例被创建两次的解决方案
1.问题产生的原因
Spring MVC的配置文件和Spring的配置文件里面都使用了扫描注解<context:component-scan base-package="com.study.springmvc" />
2.解决方案
2.1. 使 Spring 的 IOC 容器扫描的包和 SpringMVC 的 IOC 容器扫描的包没有重合的部分,把Handler和service/DAO放在不同的包下
2.2. 使用 exclude-filter 和 include-filter 子节点来规定只能扫描的注解
springmvc.xml的配置,限制只扫描Handle的注解@Controller和异常处理的注解@ControllerAdvice
1 <context:component-scan base-package="com.study.springmvc" use-default-filters="false"> 2 <context:include-filter type="annotation" 3 expression="org.springframework.stereotype.Controller"/> 4 <context:include-filter type="annotation" 5 expression="org.springframework.web.bind.annotation.ControllerAdvice"/> 6 </context:component-scan>
spring的配置,限制不扫描Handle的注解@Controller和异常处理的注解@ControllerAdvice
1 <context:component-scan base-package="com.study.springmvc"> 2 <context:exclude-filter type="annotation" 3 expression="org.springframework.stereotype.Controller"/> 4 <context:exclude-filter type="annotation" 5 expression="org.springframework.web.bind.annotation.ControllerAdvice"/> 6 </context:component-scan>
二、Spring 的 IOC 容器和 SpringMVC 的 IOC 容器的关系
SpringMVC 的 IOC 容器中的 bean 可以来引用 Spring IOC 容器中的 bean,反之不行,原因是:
1.Spring MVC是Spring的子类,子类可以引用父类,父类不能引用子类
2. 从软件层面上来说,Spring MVC是展示层可以调用业务层,业务层不能调用展示层