Spring-SpringMVC父子容器
转载自 Spring-SpringMVC父子容器
前言
Spring&SpringMVC作为bean管理容器和MVC默认框架,是大多数web应用都会选择的方案。在其使用过程中,尽管基于xml的配置bean管理的方式依然存在,但在很多情况下已经采用的强大的注解功能将其替代。实际项目中,Spring和SpringMVC同时配置,以及xml配置bean和注解的混合使用,会造成诸如bean重复加载、多次实例化、无法自动注入、配置不生效等奇怪的异常现象。其实,以上问题的大多数原因还是出在Spring容器的理解与使用上。
容器
Spring整体框架核心概念中,容器是核心思想,但在一个项目,容器不一定只有一个,Spring中可以包括多个容器,且容器间存在上下层框架。最常见的使用场景就是同时使用Spring和SpringMVC两个框架,Srping为父(根)容器,SpringMVC作为子容器。通常的使用过程中,Spring父容器对SpringMVC子容器中的bean是不可见的,而子容器对父容器的中bean却是可见的,这是这两种容器的默认规则。但是:
子容器对父容器中内容可见,不是默认规则
加载过程
web容器
对于一个web应用,需要将其部署在web容器中,web容器为其提供一个全局的ServletContext,并作为之后Spring容器提供宿主环境。
Spring根容器
<context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
1.web.xml中的contextLoaderListener在web容器启动时,会监听到web容器的初始化事件,其contextInitialized方法会被调用,在这个方法中,spring会初始化一个启动上下文作为根上下文,即WebApplicationContext。WebApplicationContext只是接口类,其实际的实现类是XmlWebApplicationContext。
2.此上下文即作为Spring根容器,其对应的bean定义的配置由web.xml中的context-param中的contextConfigLocation指定。根容器初始化完毕后,Spring以
WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE
为属性Key,将其存储到ServletContext中,便于获取。
SpringMVC子容器
<servlet><servlet-name>XXXX</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>
1.contextLoaderListener监听器初始化完毕后,开始初始化web.xml中配置的Servlet,servlet可以配置多个,加载顺序按照load-on-startup来执行。以最常见的DispatcherServlet为例,该servlet实际上是一个标准的前端控制器,用以转发、匹配、处理每个servlet请求。DispatcherServlet上下文在初始化的时候会建立自己的上下文,用以持有SpringMVC相关的bean。
2.之后先通过
WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE
先从ServletContext中获取之前的根上下文(即WebApplicationContext)作为自己上下文的父上下文,然后建立DispatcherServlet自己的上下文。这个DispatcherServlet初始化自己上下文的工作在其initStrategies方法中可以看到,内容包括初始化处理器映射、视图解析等。该servlet自己持有的上下文默认实现类也是WebApplicationContext。
3.初始化完毕后,spring以与servlet的名字相关(此处并非简单以servlet名为Key,通过转换码生存)的属性为属性Key,也将其存到ServletContext中,以便后续使用。这样每个servlet就持有自己的上下文,即拥有自己独立的bean空间,同时各个servlet共享相同的根上下文中持有的bean。
当然,在根容器创建与子容器创建之间,还会创建监听器、过滤器等,完整的加载顺序为:
ServletContext -> context-param -> listener-> filter -> servlet
由以上过程,即确定了一个bean的使用范围(该使用范围,是比bean的scope定义的singleton、prototype、request、session、global-session的五种作用域更上层的内容)。
容器布局
容器布局的根本是确定bean的使用范围。就Spring与SpringMVC布局,也大致分为了两种方向:
传统型
父容器:保存数据源、服务层、DAO层、事务的bean。
子容器:保存MVC相关的controller的bean。
概述:事务控制在服务层。由于父容器不能访问文容器中内容,事务的bean在父容器中,无法访问子容器中内容,就无法对子容器中controller进行AOP(事务),不过做为传统型方案,也没有必要这要做。
激进型
父容器:不关我事~
子容器:管理所有bean。
概述:不使用listener监听器来加载spring的配置文件,只使用DispatcherServlet来加载Spring的配置,不使用父容器,只使用一个DispatcherServlet,抛弃层次概念。
场景:在增删改查为主业务的系统里,Dao层接口,Dao层实现类,Service层接口,Service层实现类,Action父类,Action。再加上众多的O(vo\po\bo)和jsp页面,在满足分层的前提下,做一些相对较小功能时会变得非常冗余,所以“激进型”方案就出现了,没有接口、没有Service层、可以没有众多的O(vo\po\bo),所有事务控制上升到controller层。
关于布局选择吗,引用一句很合景的总结:
大项目求稳,小项目求快。
Spring-SpringMVC父子容器相关推荐
- 面试高频题:Spring和SpringMvc父子容器你能说清楚吗
引言 以前写了几篇关于SpringBoot的文章<面试高频题:springBoot自动装配的原理你能说出来吗>.<保姆级教程,手把手教你实现一个SpringBoot的starter& ...
- spring的父子容器
在创建ssm项目工程时,经常需要读取properties资源配置文件,传统的方法当然可以. 但是spring提供了更简便的方法,@value注解. 在page.properties文件中,配置分页信息 ...
- boot spring 没有父子容器_Spring 系列(二):Spring MVC的父子容器
1.背景 在使用Spring MVC时候大部分同学都会定义两个配置文件,一个是Spring的配置文件spring.xml,另一个是Spring MVC的配置文件spring-mvc.xml. 在这里给 ...
- Spring中父子容器的实现实例
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Spri ...
- java图片填充父容器_java相关:spring的父子容器及配置详解
java相关:spring的父子容器及配置详解 发布于 2020-5-26| 复制链接 本篇文章主要介绍了spring的父子容器及配置详解,详细的介绍了spring父子容器的概念.使用场景和用法,有兴 ...
- Spring和SpringMVC父子容器关系初窥
一.背景 最近由于项目的包扫描出现了问题,在解决问题的过程中,偶然发现了Spring和SpringMVC是有父子容器关系的,而且正是因为这个才往往会出现包扫描的问题,我们在此来分析和理解Spring和 ...
- 探究Spring和SpringMVC父子容器关系
兄弟萌,相信有很多人想不到 Spring 和 SpringMVC 是父子容器吧,^ - ^,下面我们来一探究竟. 一般做 SSM 框架项目时,扫描 @Controller 注解类的对象是在 Sprin ...
- Spring和springMVC父子容器的原理
首先,对于一个web应用,其部署在web容器中,web容器提供其一个全局的上下文环境,这个上下文就是ServletContext,其为后面的spring IoC容器提供宿主环境: 其次,在web.xm ...
- boot spring 没有父子容器_Spring父子容器问题
这个问题老早就存在了,只是今天组长让我看AOP不生效的时候,才真实遇到这个问题,之前都是用的Spring Boot开发,不会存在这个问题. 问题描述 如果使用传统的方式来开发Spring项目,要部署在 ...
- boot spring 没有父子容器_理解 MyBatis 是如何在 Spring 容器中初始化的
MyBatis 初始化过程就是 生成一些必须的对象放到 Spring 容器中 .问题是这个过程到底生成了哪些对象?当遇到 MyBatis 初始化失败时,如何正确的找到分析问题的切入点?本文将针对这些问 ...
最新文章
- Java问题排查工具清单!
- Hyper-V 3.0功能部署PART 5:秒级实时迁移
- python中try except处理程序异常的三种常用方法
- 求给定数组子数组中最接近0的和
- [html] 页面的重绘和回流是什么?
- 这是2019年适合Java程序员读的10本书
- Python可以减少代码量?我不信
- VS2012生成C的dll并调用以及Python调用C的DLL
- 零基础入门│带你理解Kubernetes
- 【转】win7 虚拟机virtualbox中ubuntu12.04安装samba实现文件共享
- c语言0可以除10吗,C语言10.0
- C语言学习之 数组,指针,字符串. (一)
- 如何为resin的jvm-default.log瘦身
- Base64编码解码(一)——介绍
- 基于OpenPose的人体姿态检测
- SEO优化:如何挖掘谷歌关键词-实例讲解(2022最新)
- 覆盖和覆盖D2D通信网络的传输容量分析(Matlab代码实现)
- Bazinga 题解
- 对代码规范性的一点切实感受
- 解决javascript提交form出现错误提示:对象不支持此属性或方法
热门文章
- java swing 面试题_下面有关JAVA swing的描述,说法错误的是?
- pytorch tensor 初始化_PyTorch简明笔记[1]-Tensor的初始化和基本操作
- android环境搭建出错,androidstudio配置环境遇到的各种错误(持续更新中)
- LeetCode动态规划 杨辉三角
- Function!(计蒜客 - 42386)
- min_25 推导及例题总结
- Educational Codeforces Round 111 (Rated for Div. 2) E. Stringforces 二分 + 状压dp
- 牛客题霸 [字符串的排列] C++题解/答案
- 牛客IOI周赛16-普及组
- CF1621G Weighted Increasing Subsequences(离散化+树状数组优化dp+栈维护后缀最大值+计数)