写点什么

关于 spring 与 springmvc 整合

  • 2024-05-16
    福建
  • 本文字数:2079 字

    阅读完需:约 7 分钟

关于spring与springmvc整合

spring 与 springmvc 整合

在项目中使用 springmvc 的时候,由于 spring 和 springmvc 是同源的,有时候大家会把所有的配置都扔到 springmvc 的配置文件中,而不去区分 spring 和 springmvc 的配置,而我习惯于把两个配置拆分开来,spring 来配置数据源、事务以及和其他框架的整合,springmvc 来配置 web 相关的一些配置。

只使用 springmvc 配置

先来看一下如果只是用 springmvc 配置的话,如何进行配置

先配置 web.xml,只需要配置 DispatcherServlet 即可。之后将所有的 spring 配置和 springmvc 配置都放到 springmvc.xml 的配置中

<servlet>    <servlet-name>dispatcher</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>dispatcher</servlet-name>    <url-pattern>/</url-pattern></servlet-mapping>
复制代码

<!-- more -->

区分 spring 和 springmvc 的配置

这就是本篇文章的重点了,两者整合,那就有两个配置文件了。此时就出现了 spring 父子容器,由 ContextLoaderListener 来加载 spring 配置文件,创建父容器;DispatcherServlet 加载 springmvc 配置文件,创建子容器。

看一下此时的 web.xml 如何配置

<!-- spring配置文件位置 --><context-param>    <param-name>contextConfigLocation</param-name>    <param-value>classpath:applicationContext.xml</param-value></context-param><!-- 配置监听器,加载spring配置文件 --><listener>    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><servlet>    <servlet-name>dispatcher</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>dispatcher</servlet-name>    <url-pattern>/</url-pattern></servlet-mapping>
复制代码

然后分别在 spring 和 springmvc 的配置文件中配置相关的 bean

在这里给大家说明一下两者配置整合时可能会遇到的一些问题

重复创建 bean

当 springmvc 的配置文件和 spring 的配置文件分离的时候,由于现在使用注解的比较多,大多都是用组件扫描,

如果两个配置文件都使用<context:component-scan base-package="com.zhanghe.study.springmvc"/>来进行组件扫描的话,会导致两个配置文件都扫一遍这些组件,这些 bean 都会创建两次

这时候就用到了\<context:exclude-filter>和\<context:include-filter>来进行设置过滤了

springmvc 只需要管控制器 Controller 就可以了,所以在 springmvc 的配置文件中配置

<context:component-scan base-package="com.zhanghe.study.springmvc" use-default-filters="false">    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan>
复制代码

而 spring 的配置文件中只需要相应的排除掉 springmvc 扫描的

<context:component-scan base-package="com.zhanghe.study.springmvc">    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan>
复制代码

容器关系

父容器是 ContextLoaderListener 加载的 spring 配置文件,子容器是 DispatcherServlet 加载的 spring 配置文件,子容器可以访问父容器中的 bean,反之则不行

获取 spring 容器上下文

在项目启动的时候,监听器中会在 web 应用环境初始化的时候将 spring 的上下文内容存在应用上下文中

servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);
复制代码

所以在取出来时只需要获取到应用上下文

req.getServletContext()
复制代码

然后取出来即可

context.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE)
复制代码

https://zhhll.icu/2021/框架/springmvc/基础/8.spring与springmvc整合/

前端的世界总是在不断变化,作为开发者,我们需要保持好奇心和学习热情,不断探索新的技术,只有这样,我们才能在这个快速发展的时代中立于不败之地。低代码也是一个值得我们深入探索的领域,让我们拭目以待,它将给前端世界带来怎样的变革。

介绍一款程序员都应该知道的软件JNPF快速开发平台,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。

JNPF 可以实现应用从创建、配置、开发、测试到发布、运维、升级等完整生命周期的管理。减少了传统应用程序的代码编写量,通过图形化、可视化的界面,以拖放组件的方式,即可快速生成应用程序的产品,大幅降低了开发企业管理类软件的难度。

希望这篇文章对你有所帮助~

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
关于spring与springmvc整合_伤感汤姆布利柏_InfoQ写作社区