Spring容器 SpringMVC容器 web容器的关系

article/2025/11/3 22:46:54

说到spring和springmvc,其实有很多工作好多年的人也分不清他们有什么区别,如果你问他项目里用的什么MVC技术,他会说我们用的spring和mybatis,或者spring和hibernate。

在潜意识里会认为springmvc就是spring,之前我也是这么认为的,哈哈。 

  虽然springMVC和spring有必然的联系,但是他们的区别也是有的。下面我就简单描述下

  首先 springmvc和spring它俩都是容器,容器就是管理对象的地方,例如Tomcat,就是管理servlet对象的,而springMVC容器和spring容器,就是管理bean对象的地方,再说的直白点,springmvc就是管理controller对象的容器,spring就是管理service和dao的容器,这下你明白了吧。所以我们在springmvc的配置文件里配置的扫描路径就是controller的路径,而spring的配置文件里自然配的就是service和dao的路径

  spring-mvc.xml

<context:component-scan base-package="com.smart.controller" />
  applicationContext-service.xml

<!-- 扫描包加载Service实现类 -->
    <context:component-scan base-package="com.smart.service"></context:component-scan>
或者
<context:component-scan base-package="com.smart">
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
 

  至于他是怎么管理起来的,又是怎么注入属性的,这就涉及到他们底层的实现技术了
  其次, spring容器和springmvc容器的关系是父子容器的关系。spring容器是父容器,springmvc是子容器。在子容器里可以访问父容器里的对象,但是在父容器里不可以访问子容器的对象,说的通俗点就是,在controller里可以访问service对象,但是在service里不可以访问controller对象

  所以这么看的话,所有的bean,都是被spring或者springmvc容器管理的,他们可以直接注入。然后springMVC的拦截器也是springmvc容器管理的,所以在springmvc的拦截器里,可以直接注入bean对象。

<mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/employee/**" ></mvc:mapping>
            <bean class="com.smart.core.shiro.LoginInterceptor" ></bean>
        </mvc:interceptor>
    </mvc:interceptors>
 


  而web容器又是什么鬼,
  web容器是管理servlet,以及监听器(Listener)和过滤器(Filter)的。这些都是在web容器的掌控范围里。但他们不在spring和springmvc的掌控范围里。因此,我们无法在这些类中直接使用Spring注解的方式来注入我们需要的对象,是无效的,
web容器是无法识别的。

  但我们有时候又确实会有这样的需求,比如在容器启动的时候,做一些验证或者初始化操作,这时可能会在监听器里用到bean对象;又或者需要定义一个过滤器做一些拦截操作,也可能会用到bean对象。
那么在这些地方怎么获取spring的bean对象呢?下面我提供两个方法:

1、

public void contextInitialized(ServletContextEvent sce) {
  ApplicationContext context = (ApplicationContext) sce.getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); 
  UserService userService = (UserService) context.getBean("userService");
}
 

2、

public void contextInitialized(ServletContextEvent sce) {
  WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext()); 
  UserService userService = (UserService) webApplicationContext.getBean("userService"); 
}
  注意:以上代码有一个前提,那就是servlet容器在实例化ConfigListener并调用其方法之前,要确保spring容器已经初始化完毕!而spring容器的初始化也是由Listener(ContextLoaderListener)完成,因此只需在web.xml中先配置初始化spring容器的Listener,然后在配置自己的Listener。

 

一图胜千言

å¨è¿éæå¥å¾çæè¿°

 

web容器中有servlet容器,spring项目部署后存在spring容器和springmvc容器。其中spring控制service层和dao层的bean对象。springmvc容器控制controller层bean对象。servlet容器控制servlet对象。项目启动是,首先 servlet初始化,初始化过程中通过web.xml中spring的配置加载spring配置,初始化spring容器和springmvc容器。待容器加载完成。servlet初始化完成,则完成启动。
HTTP请求到达web容器后,会到达Servlet容器,容器通过分发器分发到具体的spring的Controller层。执行业务操作后返回结果。

 

总结:

Tomcat在启动时给每个Web应用创建一个全局的上下文环境,这个上下文就是ServletContext,其为后面的Spring容器提供宿主环境。

Tomcat在启动过程中触发容器初始化事件,Spring的ContextLoaderListener会监听到这个事件,它的contextInitialized方法会被调用,在这个方法中,Spring会初始化全局的Spring根容器,这个就是Spring的IoC容器,IoC容器初始化完毕后,Spring将其存储到ServletContext中,便于以后来获取。

Tomcat在启动过程中还会扫描Servlet,一个Web应用中的Servlet可以有多个,以SpringMVC中的DispatcherServlet为例,这个Servlet实际上是一个标准的前端控制器,用以转发、匹配、处理每个Servlet请求。

Servlet一般会延迟加载,当第一个请求达到时,Tomcat&Jetty发现DispatcherServlet还没有被实例化,就调用DispatcherServlet的init方法,DispatcherServlet在初始化的时候会建立自己的容器,叫做SpringMVC 容器,用来持有Spring MVC相关的Bean。同时,Spring MVC还会通过ServletContext拿到Spring根容器,并将Spring根容器设为SpringMVC容器的父容器,请注意,Spring MVC容器可以访问父容器中的Bean,但是父容器不能访问子容器的Bean, 也就是说Spring根容器不能访问SpringMVC容器里的Bean。说的通俗点就是,在Controller里可以访问Service对象,但是在Service里不可以访问Controller对象。

参考链接:

https://blog.csdn.net/qfikh/article/details/80507011

https://blog.csdn.net/zhanglf02/article/details/89791797 


http://chatgpt.dhexx.cn/article/d2tMMduh.shtml

相关文章

SpringBoot深入(一)--SpringBoot内置web容器及配置

版权声明&#xff1a;作者原创&#xff0c;转载请注明出处。 本系列文章目录地址&#xff1a;http://blog.csdn.net/u011961421/article/details/79416510 前言 在学会基本运用SpringBoot同时&#xff0c;想必搭过SSH、SSM等开发框架的小伙伴都有疑惑&#xff0c;SpringBoot在…

SpringBoot内置web容器及配置

前言 在学会基本运用SpringBoot同时&#xff0c;想必搭过SSH、SSM等开发框架的小伙伴都有疑惑&#xff0c;SpringBoot在spring的基础上做了些什么&#xff0c;使得使用SpringBoot搭建开发框架能如此简单&#xff0c;便捷&#xff0c;快速。本系列文章记录博主网罗博客、分析源码…

Web 容器、HTTP 服务器 、Servlet 容器区别与联系

首先浏览器发起 HTTP 请求&#xff0c;像早期的时候只会请求一些静态资源&#xff0c;这时候需要一个服务器来处理 HTTP 请求&#xff0c;并且将相应的静态资源返回。 这个服务器叫 HTTP 服务器。 简单点说就是解析请求&#xff0c;然后得知需要服务器上面哪个文件夹下哪个名字…

常见的几种web容器(Apache、Nginx、Tomcat)

目录 前言ApacheNginxTomcat ~~~~~~~~ 因为想要面对一个新的开始&#xff0c;一个人必须有梦想、有希望、有对未来的憧憬。如果没有这些&#xff0c;就不叫新的开始&#xff0c;而叫逃亡。 ​​​​ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~…

web容器、中间件以及web服务器的区别

一、web容器 1.web容器的介绍 web容器是一种服务程序&#xff0c;在服务器一个端口就有一个提供相应服务的程序&#xff0c;而这个程序就是处理从客户端发出的请求。实际上&#xff0c;Web容器是一种服务程序&#xff0c;给处于其中的应用程序组件提供环境&#xff0c;使其直接…

Web容器的作用

在eclipse中创建web项目时&#xff0c;会选择一个target runtime&#xff0c;意思就是在什么上面运行&#xff0c;也就是运行时的web容器。我们常用的Tomcat就是一种web容器。简单来说&#xff0c;web容器也就是servlet容器。主要有以下作用&#xff1a; 1.通信支持 通过web容…

docker——Ubuntu镜像操作和apache web容器操作小实训

文章目录 Ubuntu镜像操作apache web容器操作 Ubuntu镜像操作 &#xff08;1&#xff09;拉取最新的Ubuntu官方镜像。 &#xff08;2&#xff09;查看该镜像的详细信息。 &#xff08;3&#xff09;查看该镜像的构建历史。 &#xff08;4&#xff09;删除该镜像。 apache w…

经典Web容器解析漏洞

目录 Apache 文件名解析漏洞(info.php.x 绕过) IIS6.0解析漏洞 文件名解析漏洞(time.asp;1.jpg&#xff09; 目录解析漏洞(1.asp/time.jpg) PHP-CGI 解析漏洞&#xff08;IIS 7.0&#xff08;info.png/.php&#xff09;&#xff09; Nginx解析漏洞 1. 空字节漏洞&#x…

web容器解析

目录&#xff1a; 简述web服务器功能web服务器的限制辅助应用servletweb容器的作用web容器和web服务器的区别和联系 一、简述web服务器功能。 web服务器主要作用是处理客户请求&#xff0c;并作出响应。当浏览器发送一个HTTP请求到web服务器&#xff0c;web服务器解析请求&am…

web容器

目录 前言1、 Web容器简介1.1 Web容器的定义 2、 Web容器的作用2.1 概念区分2.1.1 架构 & 框架2.1.2 Web服务器&#xff08;Web Server&#xff09;2.1.3 中间件&#xff08;Middleware&#xff09; 2.2 Web容器与Spring、Web应用等的关系2.3 Web容器在web开发中的作用 3、…

Web容器(一):Web容器简介

本文参照&#xff1a;极客时间-《深入拆解 Tomcat & Jetty》-开篇词 | Java程序员如何快速成长 01_Web容器学习路径 Web容器 Web技术的发展史 早期的Web应用主要用于浏览新闻等静态页面&#xff0c;HTTP服务器&#xff08;比如Apache、Nginx&#xff09;向浏览器返回静…

MyBatis分页及分页插件使用

7.分页 7.1 作用 减少数据处理量&#xff0c;一次数据量太大了对数据库和网络压力太大 SELECT * FROM school.user LIMIT startIndex,pageSize SELECT * FROM school.user LIMIT 2 -- 0,2 SELECT * FROM school.user LIMIT 2,2 -- startIndex从0开始使用mybatis实现分页步骤…

mybatis-plus 分页插件

目录 1 前言 2 配置分页插件 2.1 selectPage()测试 2.2 自定义分页功能 1 前言 大家之前肯定都用过PageHelper来进行分页&#xff0c;其实mybatisplus中也提供了一个分页插件PaginationInnerInterceptor&#xff0c;其实分页的本质就是内部封装了一个拦截器&#xff0c;对…

springboot使用分页插件

业务逻辑&#xff1a;我想要实现对必备材料信息列表的分页展示&#xff0c;包括查询后的信息也要分页展示 效果图 解决思路&#xff1a; 首先实体类用来接收数据&#xff0c;有一个Dao类用来进行sql查询&#xff0c;有一个servcie(需要传pageNum,PageSiz)&#xff0c;serviceIm…

Mybatis-分页插件

目录 引入介绍 回顾MySQL的limit实现简易分页 问题的产生与解决 分页插件实现步骤 实例演示 分页插件相关参数 实例演示 引入介绍 分页可以将很多条结果进行分页显示如果当前在第一页&#xff0c;则没有上一页如果当前在最后一页&#xff0c;则没有下一页需要明确当前是第几页…

BootStrap分页插件

BootStrap分页插件 官网 官方网址&#xff1a;https://labs.pontikis.net/bs_pagination/docs/ 怎么使用 引入插件所需要的资源文件 <link href"jquery/bootstrap_3.3.0/css/bootstrap.min.css" type"text/css" rel"stylesheet" /> &l…

MyBatis分页插件

目录 分页插件 Mybatis插件典型适用场景 实现思考 第一个问题 第二个问题 自定义分页插件 分页插件使用 添加pom依赖 插件注册 调用 代理和拦截是怎么实现的 PageHelper 原理 分页插件 MyBatis 通过提供插件机制&#xff0c;让我们可以根据自己的需要去增强MyBati…

分页利器——pageHelper分页插件

pageHelper插件在分页上有哪些优势&#xff1f; 分页插件给我们封装了很多参数&#xff0c;不用我们再去硬性编码获取各种参数。 pageHelper封装参数如下&#xff0c;这个参数封装在com.github.pagehelper.page中&#xff1a; count&#xff1a;是否进行count查询&#xff0c;…

分页插件--PageHelper

mybatis的分页查询可以通过PageHelper插件实现 在数据库中我们使用分页查询的sql语句为&#xff1a; select * from 表名 [where 条件] limit (page-1)*pageSize, pageSize; page: 当前页码 pageSize: 每页显示的条数。但是当我们使用PageHelper插件后页码什么的都不用我们计算…

分页插件

10-分页插件-分页插件的介绍 分页可以将很多条结果进行分页显示。如果当前在第一页&#xff0c;则没有上一页。如果当前在最后一页&#xff0c;则没有下一页。需要明确当前是第几页&#xff0c;这一页中显示多少条结果。MyBatis分页插件总结 在企业级开发中&#xff0c;分页也是…