spring中的web上下文,spring上下文,springmvc上下文区别(超详细)

web上下文(Servlet context),spring上下文(WebApplication Context),springmvc上下文(mlWebApplicationCont)之间区别.

上下文:可以简单的理解为容器,配置文件

web上下文目标对象是所有web应用,spring上下文目标对象是单个web应用,spring mvc目标对象是单个web应用的spring mvc框架(是spring上下文的子上下文,即继承自spring上下文,所以子能够调用父的东西,反之,不可)。

以上感觉自己理解有偏差,看到一篇不错的,先markdow

原文链接

一、先说ServletContext

  javaee标准规定了,servlet容器需要在应用项目启动时,给应用项目初始化一个ServletContext作为公共环境容器存放公共信息。ServletContext中的信息都是由容器提供的。

举例: 
通过自定义contextListener获取web.xml中配置的参数 1.容器启动时,找到配置文件中的context-param作为键值对放到ServletContext中 2.然后找到listener,容器调用它的contextInitialized(ServletContextEvent event)方法,执行其中的操作 例如:在web.xml中配置

<context-param>
   <param-name>key</param-name>
   <param-value>value123</param-value>
</context-param>
<listener>
   <listener-class>com.brolanda.contextlistener.listener.ContextListenerTest</listener-class>
</listener>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

配置好之后,在该类中获取对应的参数信息

package com.brolanda.contextlistener.listener;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class ContextListenerTest implements ServletContextListener {

    public void contextDestroyed(ServletContextEvent event) {
        System.out.println(‘*************destroy ContextListener*************‘);
    }

    @SuppressWarnings(‘unused‘)
    public void contextInitialized(ServletContextEvent event) {
        System.out.println(‘*************init ContextListener*************‘);
        ServletContext servletContext = event.getServletContext();
        System.out.println(‘key:‘+servletContext.getInitParameter(‘key‘));
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

执行流程:

  web.xml在标签中声明应用范围内的初始化参数 
1.启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: 和 2.紧接着,容器创建一个ServletContext(上下文)。在该应用内全局共享。

3.容器将转化为键值对,并交给ServletContext. 
4.容器创建中的类实例,即创建监听.该监听器必须实现自ServletContextListener接口

5.在监听中会有contextInitialized(ServletContextEvent event)初始化方法 
在这个方法中获得ServletContext = ServletContextEvent.getServletContext(); 
“context-param的值” = ServletContext.getInitParameter(‘context-param的键’); 6.得到这个context-param的值之后,你就可以做一些操作了.注意,这个时候你的WEB项目还没有完全启动完成.这个动作会比所有的Servlet都要早.换句话说,这个时候,你对中的键值做的操作,将在你的WEB项目完全启动之前被执行. web.xml中可以定义两种参数: 一个是全局参数(ServletContext),通过 一个是servlet参数,通过在servlet中声明    param1 avalible in servlet init() 第一种参数在servlet里面可以通过getServletContext().getInitParameter(‘context/param’)得到 第二种参数只能在servlet的init()方法中通过this.getInitParameter(‘param1’)取得

二、spring上下文容器配置

  spring为我们提供了实现ServletContextListener接口的上下文初始化监听器:org.springframework.web.context.ContextLoaderListener

  spring为我们提供的IOC容器,需要我们指定容器的配置文件,然后由该监听器初始化并创建该容器。要求你指定配置文件的地址及文件名称,一定要使用:contextConfigLocation作为参数名称。

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml,/WEB-INF/action-servlet.xml,/WEB-INF/jason-servlet.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

该监听器,默认读取/WEB-INF/下的applicationContext.xml文件。但是通过context-param指定配置文件路径后,便会去你指定的路径下读取对应的配置文件,并进行初始化。

三、spring上下文容器配置后,初始化了什么?

  既然,ServletContext是由Servlet容器初始化的,那spring的ContextLoaderListener又做了什么初始化呢? 
1、servlet容器启动,为应用创建一个“全局上下文环境”:ServletContext 2、容器调用web.xml中配置的contextLoaderListener,初始化WebApplicationContext上下文环境(即IOC容器),加载context-param指定的配置文件信息到IOC容器中。WebApplicationContext在ServletContext中以键值对的形式保存 3、容器初始化web.xml中配置的servlet,为其初始化自己的上下文信息servletContext,并加载其设置的配置信息到该上下文中。将WebApplicationContext设置为它的父容器。 4、此后的所有servlet的初始化都按照3步中方式创建,初始化自己的上下文环境,将WebApplicationContext设置为自己的父上下文环境。

对于作用范围而言,在DispatcherServlet中可以引用由ContextLoaderListener所创建的ApplicationContext中的内容,而反过来不行。 当Spring在执行ApplicationContext的getBean时,如果在自己context中找不到对应的bean,则会在父ApplicationContext中去找。这也解释了为什么我们可以在DispatcherServlet中获取到由ContextLoaderListener对应的ApplicationContext中的bean。

四、spring配置时:的使用原因,为什么在applicationContext.xml中排除controller,而在spring-mvc.xml中incloud这个controller 
既然知道了spring的启动流程,那么web容器初始化webApplicationContext时作为公共的上下文环境,只需要将service、dao等的配置信息在这里加载,而servlet自己的上下文环境信息不需要加载。故,在applicationContext.xml中将@Controller注释的组件排除在外,而在dispatcherServlet加载的配置文件中将@Controller注释的组件加载进来,方便dispatcherServlet进行控制和查找。故,配置如下: applicationContext.mxl中:

  <context:component-scan
  base-package=‘com.linkage.edumanage‘>
   <context:exclude-filter expression=‘org.springframework.stereotype.Controller‘    type=‘annotation‘ />   </context:component-scan>   

spring-mvc.xml中:   

<context:component-scan
base-package=‘com.brolanda.cloud‘   use-default-filters=‘false‘>
<context:include-filter expression=‘org.springframework.stereotype.Controller‘    type=‘annotation‘ />
</context:component-scan> 

1

2

  • 3
  • 4
  • 5
  • 6
  • 7

package com.brolanda.contextlistener.listener; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class ContextListenerTest implements ServletContextListener { public void contextDestroyed(ServletContextEvent event) { System.out.println(‘*************destroy ContextListener*************‘); } @SuppressWarnings(‘unused‘) public void contextInitialized(ServletContextEvent event) { System.out.println(‘*************init ContextListener*************‘); ServletContext servletContext = event.getServletContext(); System.out.println(‘key:‘+servletContext.getInitParameter(‘key‘));

小知识: 
1.为什么要在spring-mvc.xml过滤器添加 use-default-filters=’false’。 
答:因为use-default-filters用来指示是否自动扫描带有 
@Component、@Repository、@Service和@Controller的类。默认为true,即默认扫描。而我们要求只是扫描Controller.

相关链接

2.为什么spring中的扫包要除去controller,spring mvc中只扫controller(pring MVC管理Controller,Spring 管理Controller之外的Bean)。 
答:这个跟spring mvc的工作流程有关,spring mvc主要bean就是实现了Controller接口的controller类.看图:

其中Handler Mapping是一个xxx-servlet.xml文件,这个是DispatchServlet上下文(注意是DispatchServlet的)配置文件,里面配置了对于不同url即请求对应的控制器.

相关JSP学习推荐人民邮电出版社的JSP程序设计(page 230有spring mvc内容)。

不过我自身残留个疑问,既然spring mvc的上下文继承了spring的上下文,那么其实spring mvc把全部包都扫了好像也不会出问题,只不过把继承至父类的bean覆盖掉而已,待解决.

时间: 2024-08-07 04:31:09

spring中的web上下文,spring上下文,springmvc上下文区别(超详细)的相关文章

Spring中的Autowired注解和Resource注解的区别

1.所属jar包不同,Autowired是Spring中的Resource是JSR-250规范定义的注解 2.自动装配时可以选择的参数不一样,具体的可以看其接口 Resource里面有这几个可以配置的,我只能看懂name 和 type,意思分别是按名称装配,按类型装配. 默认安装名称进行装配.当找不到与名称匹配的bean时才按照类型进行装配. 如果name属性一旦指定,就只会按照名称进行装配. 如果指定了type,则按照类型进行装配,找不到或者找到多个bean,都会抛出异常 autowired:

在Spring中配置Hibernate和单独配置Hibernate的区别

首先说下Spring和Hibernate的几个特征: Spring:自动依赖注入,类都可以被当成bean使用. Hibernate:会话工厂sessionfactory,事务管理器transaction. 如果只使用Hibernate,那么当你操作数据库的时候,需要敲诸如: Configuration conf = new Configuration().configure(); SessionFactory sf = conf.buildSessionFactory(); Session se

阶段3 2.Spring_10.Spring中事务控制_4 spring中事务控制的一组API

分析aop的 xml 的代码.更直观一些 事务提交和回滚就是我们重复的代码 spring业余事务管理器,我们拿过来直接用就可以 提交和回滚的后面直接调用释放.所以释放资源之类就是多余的 在绑定连接到线程的时候,直接就设置成false,所以开启事务这个通知 也是多余的 spring中的事务 需要先导入包pom.xml 用刚上线类.DataSourceTransactionManager 如果用到Hibernate的话.这个是真正带着代码的实现类 TransactionDefinition 事务的隔

如何在手动获取spring中的bean(Spring ApplicationContextAware获取上下文)

一.目的 写了一个项目,多个module,然后想在A模块中实现固定的config注入,当B模块引用A时候,能够直接填写相对应的配置信息就行了.但是遇到一个问题,B引用A时候,A的配置信息总是填充不了,获取不到在B中配置好的信息.猜测原因:因为项目的的bean文件没有被统一管理. 二.ApplicationContextAware 接口 Spring 提供了ApplicationContextAware类,通过它可以获取所有bean上下文. 也就是说,当一个类实现了这个接口之后,这个类就可以方便地

Java日志框架-Spring中使用Logback(Spring/Spring MVC)

继上一篇文章http://www.cnblogs.com/EasonJim/p/7800880.html中所集成的是基于Java的普通项目,如果要在Spring和Spring MVC上集成,需要做如下处理: 一.Spring POM: <!-- Logback --> <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic --> <dependency> <groupId>

Spring中的Quartz配置 Spring 定时器 java定时器

QuartzJob.java 本程序是放在web 项目中,启动加载后.5份钟自动调用一次 [java] view plaincopyprint? public class  { public void work() { System.out.println("Quartz的任务调度!!!"); Calendar cal=Calendar.getInstance(); System.out.println(cal.getTime()); } } Spring 配置文件 [html] vi

阶段3 2.Spring_10.Spring中事务控制_5 spring事务控制的代码准备

创建一个工程,只搭建环境不做配置.等配置的时候把这个项目相关的代码再复制到新项目里面 jar包的打包方式 导入包 事务控制也是基于AOP的.所以这里导入aspectjweaver 复制jdbcTemplate中的代码 复制到当前项目里面 对代码进行改造和删减 删除 resources里面的配置要删减一些  删除 事务是控制在业务层的.所以需要新建Service的接口 一个id查询的方法 一个转账的方法 增加实现类Impl文件夹.然后.把直线xml项目的代码复制过来. 复制到我们的工程下的Impl

阶段3 2.Spring_10.Spring中事务控制_9 spring编程式事务控制1-了解

编程式的事物控制,使用的情况非常少,主要作为了解 新建项目 首先导入包坐标 复制代码 这里默认值配置了Service.dao和连接池其他的内容都没有配置 也就说现在是没有事物支持的.运行测试文件 有错误,但是金额还是被减去了 编码的方式加事务控制 事务控制都离不开提交和回滚这两个操作.在spring里面它吧提交和回滚的方法提交到事务管理器里面了. 于是我们无论如何都需要在bean.xml里面配置事务管理器 接下来要进行事务控制,那肯定需要提交和回滚的操作 spring提交了一个对象,叫做事务模板

spring中的BeanFactory与ApplicationContext的作用和区别?

作用: 1. BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的声明周期.2. ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能: a. 国际化支持b. 资源访问:Resource rs = ctx. getResource(“classpath:config.properties”), “file:c:/config.properties”c. 事件传递:通过实