Spring MVC框架:第十五章:多IOC容器整合

简介: Spring MVC框架:第十五章:多IOC容器整合

多IOC容器整合

SSM整合方式

Spring、SpringMVC、MyBatis

SpringMVC的核心Servlet会启动一个IOC容器,而ContextLoaderListener也会启动一个IOC容器。

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">
  <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:spring-mvc.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>
  <!-- 在Servlet的上下文参数中指定Spring配置文件的配置 -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-tx.xml</param-value>
  </context-param>
  <listener>
    <!-- 配置ContextLoaderListener监听器,初始化WebApplicationContext这个类型的IOC容器 -->
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
</web-app>

对象重复创建为问题

两个IOC容器分别扫描不同的包时不会有重复创建对象问题[推荐]

SpringMVC扫描:com.ioc.component.handler

Spring扫描:

com.ioc.component.service

com.ioc.component.dao

特定情况下两个IOC容器都扫描同一个包

com.ioc.component

不做特殊处理会存在对象重复创建问题

在实际开发中我们通常还是需要将二者分开。

1.同时配置两个IOC容器

为了实现更好的解耦,我们在实际开发中往往还是需要将数据源、Service、Dao等组件配置到传统的Spring配置文件中,并通过ContextLoaderListener启动这个IOC容器。 而在表述层负责处理请求的handler组件则使用SpringMVC自己来启动。 这会导致一个问题:同样的组件会被创建两次。

2.两个IOC容器的各自配置

Spring的IOC容器 将标记了@Controller注解的bean排除

Spring配置文件:spring-tx.xml

<context:component-scan base-package="com.ioc.component.*">
  <!-- 将@Controller注解标记的类从自动扫描的包中排除 -->
  <!-- 效果:当前IOC容器不会创建@Controller注解标记的类的bean -->
  <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

仅包含标记了@Controller等注解的bean

SpringMVC配置文件:spring-mvc.xml

<!-- 关键:仅 -->
<!-- 配置use-default-filters="false"将默认的扫描包规则取消,参考include-filter仅创建@Controller注解标记的类的bean -->
<context:component-scan base-package="com.ioc.component.*" use-default-filters="false">
  <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

这两个IOC容器中,先启动的那个将成为后启动的IOC容器的父容器。

小结:

DispatcherServlet读取spring-mvc.xml配置文件

ContextLoaderListener读取spring-tx.xml配置文件

过滤规则

exclude-filter

include-filter

异常映射

SpringMVC配置文件

<!-- 配置异常映射关系 -->
<bean id="simpleMappingExceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
  <property name="exceptionMappings">
    <props>
      <!-- 将异常类型和视图名称关联起来 -->
      <!-- 这个机制工作后会自动将捕获到的异常对象存入请求域,默认属性名是exception -->
      <prop key="java.lang.RuntimeException">error</prop>
    </props>
  </property>
  <!-- 指定将异常对象存入请求域时使用的属性名 -->
  <property name="exceptionAttribute" value="exception"></property>
</bean>

页面上:

exception:${requestScope.exception}

相关文章
|
安全 Java Ruby
我尝试了所有后端框架 — — 这就是为什么只有 Spring Boot 幸存下来
作者回顾后端开发历程,指出多数框架在生产环境中难堪重负。相比之下,Spring Boot凭借内置安全、稳定扩展、完善生态和企业级支持,成为构建高可用系统的首选,真正经受住了时间与规模的考验。
850 2
|
XML JSON Java
Spring框架中常见注解的使用规则与最佳实践
本文介绍了Spring框架中常见注解的使用规则与最佳实践,重点对比了URL参数与表单参数的区别,并详细说明了@RequestParam、@PathVariable、@RequestBody等注解的应用场景。同时通过表格和案例分析,帮助开发者正确选择参数绑定方式,避免常见误区,提升代码的可读性与安全性。
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
970 8
|
监控 Kubernetes Cloud Native
Spring Batch 批处理框架技术详解与实践指南
本文档全面介绍 Spring Batch 批处理框架的核心架构、关键组件和实际应用场景。作为 Spring 生态系统中专门处理大规模数据批处理的框架,Spring Batch 为企业级批处理作业提供了可靠的解决方案。本文将深入探讨其作业流程、组件模型、错误处理机制、性能优化策略以及与现代云原生环境的集成方式,帮助开发者构建高效、稳定的批处理系统。
1019 1
|
Cloud Native Java API
Java Spring框架技术栈选和最新版本及发展史详解(截至2025年8月)-优雅草卓伊凡
Java Spring框架技术栈选和最新版本及发展史详解(截至2025年8月)-优雅草卓伊凡
1879 0
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
1530 108