Spring与SpringMVC之父子容器

Spring与SpringMVC父子容器问题 在Spring整体框架的核心概念中,容器是核心思想,就是用来管理Bean的整个生命周期的,而在一个项目中,容器不一定只有一个,Spring中可以包括多个容器,而且容器有上下层关系,目前最常见的一种场景就是在一个项目中引入Spring和SpringMVC这两个框架,那么它其实就是两个容器,Spring是父容器,SpringMVC是其子容器,并且在Spring父容器中注册的Bean对于SpringMVC容器中是可见的,而在SpringMVC容器中注册的Bean对于Spring父容器中是不可见的,也就是子容器可 阅读详情

父子容器

这里写图片描述
以上的图解由以下配置实现
spring扫描存放mapper以及service的包,而springmvc只扫描存放controller的包

理论上讲,两者都可以扫描所有的包,但是这样做并不合适,浪费资源

  1. 情况1:spring管理mapper,springmvc管理controller、service,那spring配置的事务以及切面就不起作用了。
  2. 情况2:spring管理mapper、service、controller(即扫描所有的包),springmvc管理controller,那spring的controller就多余了,因为springmvc优先使用自己容器里的controller

总结:以上图解是合适的配置,spring管理mapper、service,springmvc管理controller

知识点:

  • 1、子容器可以访问父容器的对象,父容器不能访问子容器中的对象

这也就是为什么controller可以注入service,而service不能使用controller

  • 2、子容器不能访问父容器里的属性

spring配置文件中,使用以下语句加载配置文件

<context:property-placeholder location="classpath:properties/*.properties" />

由spring管理的对象可以访问,而springmvc管理的对象则访问不到

比如:上面图解为例
/properties/resource.properties文件内容如下:

SPRING_FLAG=123

在服务器启动时,spring会加载该文件。
service对象中

@Value("${SPRING_FLAG}")
private String SPRING_FLAG;

controller对象中

@Value("${SPRING_FLAG}")
private String SPRING_FLAG;

结果:service对象取得到该值,而controller对象取不到


如果你使用了listener监听器来加载配置,一般在Struts+Spring+Hibernate的项目中都是使用listener监听器的。如下

<listener>    
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>    
</listener>   

Spring会创建一个WebApplicationContext上下文,称为父上下文(父容器) ,保存在 ServletContext中,key是WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE的值。

可以使用Spring提供的工具类取出上下文对象:

WebApplicationContextUtils.getWebApplicationContext(ServletContext);

DispatcherServlet是一个Servlet,可以同时配置多个,每个 DispatcherServlet有一个自己的上下文对象(WebApplicationContext),称为子上下文(子容器),子上下文可以访问父上下文中的内容,但父上下文不能访问子上下文中的内容。 它也保存在 ServletContext中,key是”org.springframework.web.servlet.FrameworkServlet.CONTEXT”+Servlet名称。当一个Request对象产生时,会把这个子上下文对象(WebApplicationContext)保存在Request对象中,key是DispatcherServlet.class.getName() + “.CONTEXT”。

可以使用工具类取出上下文对象:

RequestContextUtils.getWebApplicationContext(request);

说明 :Spring 并没有限制我们,必须使用父子上下文。我们可以自己决定如何使用。

方案一,传统型:

父上下文容器中保存数据源、Service层、DAO层、事务的Bean。

子上下文容器中保存Mvc相关的Action的Bean。

事务控制在Service层。

由于父上下文容器不能访问子上下文容器中内容,事务的Bean在父上下文容器中,无法访问子上下文容器中内容,就无法对子上下文容器中Action进行AOP(事务)。

当然,做为“传统型”方案,也没有必要这样做。

方案二,激进型:

Java世界的“面向接口编程”的思想是正确的,但在增删改查为主业务的系统里,Dao层接口,Dao层实现类,Service层接口,Service层实现类,Action父类,Action。再加上众多的O(vo\po\bo)和jsp页面。写一个小功能 7、8个类就写出来了。 开发者说我就是想接点私活儿,和PHP,ASP抢抢饭碗,但我又是Java程序员。最好的结果是大项目能做好,小项目能做快。所以“激进型”方案就出现了,没有接口、没有Service层、还可以没有众多的O(vo\po\bo)。那没有Service层,事务控制在哪一层?只好上升的Action层。

本文不想说这是不是正确的思想,我想说的是Spring不会限制你这样做。

由于有了父子上下文,你将无法实现这一目标。解决方案是只使用子上下文容器,不要父上下文容器 。所以数据源、Service层、DAO层、事务的Bean、Action的Bean都放在子上下文容器中。就可以实现了,事务(注解事务)就正常工作了。这样才够激进。

总结:不使用listener监听器来加载spring的配置文件,只使用DispatcherServlet来加载spring的配置,不要父子上下文,只使用一个DispatcherServlet,事情就简单了,什么麻烦事儿也没有了。

  • Java–大项目能做好–按传统方式做,规规矩矩的做,好扩展,好维护。
  • Java–小项目能做快–按激进方式做,一周时间就可以出一个版本,先上线接受市场(用户)的反馈,再改进,再反馈,时间就是生命(成本)。
手把手教你用CODESYS将旧笔记本改造成软PLC(含证书配置避坑指南) 本文提供了一份详尽的指南,教你如何利用CODESYS平台将闲置旧笔记本改造为一台功能完整的软PLC。内容涵盖从硬件评估、系统实时性优化、软件安装与驱动配置,到关键的证书授权管理避坑指南,旨在帮助自动化工程师和爱好者低成本搭建稳定可靠的学习与开发平台。 阅读详情

相关推荐

嵌入式系统实战:DroneCAN协议栈移植与避坑指南

本文详细介绍了在嵌入式系统中移植DroneCAN协议栈的完整流程与实战技巧。内容涵盖移植前的准备工作、内存管理优化、CRC校验实现、多帧数据处理及硬件平台适配等关键环节,并以STM32F4为例提供了具体的移植步骤和避坑指南,帮助开发者高效完成DroneCAN在嵌入式设备上的集成与应用。

solidity8miner的博客 547

Spring容器与其子容器Spring MVC 冲突问题

容器是整个Spring 框架的核心思想,用来管理Bean的整个生命周期。 一个项目中引入Spring和SpringMVC这两个框架,Spring是父容器,SpringMVC是其子容器,子容器可以看见父容器中的注册的Bean,反之就不行。请记住这个特性。 spring 容器基础释义 1 我们可以使用统一的如下注解配置来对Bean进行批量注册,而不需要再给每个Bean单独使用xml的方式进行配置。 <context:component-scan base-package="com.amu.mo

clz1314521的专栏 553

基于N32G003的PMBus从机协议栈设计与STM32F103模拟I2C主机通信实战

本文详细介绍了基于N32G003微控制器设计PMBus从机协议栈,并与STM32F103模拟I2C主机进行通信的实战方案。重点阐述了中断驱动架构、命令解析、CRC8优化及超时恢复机制,实现了在70kHz速率下稳定可靠的工业电源管理通信,适用于服务器电源、通信基站等成本敏感应用场景。

numpy6sculptor的博客 919

spring boot 自动扫描Controller、Service、Component原理

spring boot 启动类加上@SpringBootApplication会自动扫描当前目录,及子目录下的Controller,Service,Component注解的bean。##看到ConfigurationClassParser解析ComponentScans.class, ComponentScan.class注解。查看@SpringBootApplication注解源码,里面有@ComponentScan注解。启动类没有@ComponentScan注解。##包名为空,添加启动类所在的包。

u014200244的专栏 2479

手把手教你用U盘给海信IP501H刷机:GK6323V100C芯片的4.4.2和9.0固件实战

本文详细介绍了海信IP501H电视盒子基于GK6323V100C芯片的刷机实战指南,涵盖Android 4.4.2强刷和Android 9.0免拆刷机两种方案。从工具准备、短接操作到ADB调试,提供全流程解析和常见问题解决方案,帮助用户安全高效地完成刷机操作。

lemon的博客 1454

Android11,无障碍服务模拟多手势使用dispatchGesture时总是onCancelled

AccessibilityService的dispatchGesture去模拟多手势,总是onCancelled的一种解决办法

m0_49953943的博客 2102

【Java】Spring、SpringMVC父子容器

需知前提: Spring是一个容器(会将所有的bean放在里面)(父容器) { Mapper代理对象、 Service对象、 SpringMVC容器(子容器)      {Controller对象} } 父子容器特点: 子容器可以访问父容器对象(Controller可以注入Service),但是不能跨容器访问属性 父容器不能访问子容器中对象(Service不能注入Contr...

The Beginning 360

基于MATLAB编程的LSTM的时间序列预测

时间序列预测,回归分析,LSTM详细原理

abc991835105的博客 358

spring和springmvc的父子容器的关系

首先,必须先理解spring在web容器的是如何运行的。  1 对于一个web应用,当其部署在web容器上时,web容器就会给其提供一个全局的上下文环境ServletContext. 这个上下文环境将为后面的所有的spring有关的容器提供宿主环境,相当于是提供一个仓库。后面的所有的容器都将装在里面。 补充:什么是ServletContex对象?     ServletCo

JJ_nan的博客 4800

深度强化学习在足式机器人中的应用 (一):基础原理与仿真环境

我们将首先深入探讨其背后的核心挑战与技术栈,然后详细推导机器人学和强化学习的基本数学原理,特别是剖析在机器人控制领域表现卓越的PPO算法。下面的独立Python脚本展示了Isaac Gym的基本API用法,加载一个Go1机器人(假设URDF已准备好),并让它执行一个简单的预设动作(正弦波运动),以此来熟悉仿真流程。:代码的核心是直接操作GPU上的PyTorch张量,避免了CPU和GPU之间的数据拷贝,这是实现高性能的关键。:所有计算(如伪策略中的正弦波计算)都应该是向量化的,一次性为所有。

VectorShift的博客 228

MATLAB从入门到精通-APP调用simulink中的参数,并且修改,将结果返回到APP中

本次案例为以下微分方程: 其中方程的初始值为: Step1:搭建simulink文件,如下图所示: 初始值配置在积分模块中,如下图所示: Step2:制作app 操作视频: ,时长01:11 代码: 本文包括APP如何回调simulik中d的参数,以及把simulink中的仿真结果输出到APP中的绘图界面中。 核心代码如下: ...

wenyusuran的专栏 3041

spring 父子容器关系

spring bean 在子工厂没用找到 会去父工厂拿 DI AOP IOC的实现原理 反射 + 动态代理 在BeanPostProcessor 层面实现 运行期增强 编译期增强 (aspect loombok) 载入时增强

stone_tomcate的博客 414

RK3588+YT9215快速拓展以太网口

YT9215支持7个端口的非阻塞数据传输,确保高效的数据流处理;在开发过程中,最重要的一点就是YT9215与RK3588的GMAC连接和配置部分,下面是gmac1对应dtsi文件的修改,包括注释掉rgmii_phy1对应的mdio1,以及gmac1对应的phy-handle部分,同时将gmac1修改成1000Mbps全双工模式。这就是最简单,最快速的RK3588拓展网口的方法了,如果需要用到交换芯片的其他功能,那就不可以直接使用原厂提供的bin,而是需要对YT9215进行另外的驱动开发。

带着耳朵取流浪的博客 2784

Spring与SpringMVC父子容器详解

Spring和SpringMVC的容器具有父子关系,Spring容器为父容器,SpringMVC为子容器,子容器可以引用父容器中的Bean,而父容器不可以引用子容器中的Bean。 1. Spring父容器配置 2. Spring MVC子容器配置 3.Spring父容器(ioc)初始化过程 (1)、web应用程序启动时,tomcat会读取web.xml文件中的context-parm(含有配置文件的路径)和listener节点,接着会为应用程序创建一个ServletContex...

rogerxue12345的博客 2010

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

spring与springmvc父子容器

在spring和springmvc进行整合的时候,一般情况下我们会使用不同的配置文件来配置spring和springmvc,因此我们的应用中会存在至少2个ApplicationContext实例,由于是在web应用中,因此最终实例化的是ApplicationContext的子接口WebApplicationContext。

CHIKA2333的博客 358

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Spring+SpringMVC父子容器?

这篇文章分享一下关于早期SpringMVC版本的一个重要概念:父子容器。

qq_20395245的博客 573

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Spring与SpringMvc之父子容器

父子容器概念 首先看一看springweb项目配置文件 由图可见,springweb项目中创建了2个WebApplicationContext,分别是spring创建的容器applicationContext.xml和springmvc创建的dispatcher-servlet.xml。 作用: springmvc   dispatcher-servlet.xml:在MVC三层模型中的controller控制层中,与视图解析器ViewReslover,HandlerMappi

qq_38425803的博客 938

71.Spring和SpringMVC为什么需要父子容器?

71.Spring和SpringMVC为什么需要父子容器?

weixin_43860634的博客 1241

Spring 之Spring与SpringMVC父子容器详解

文章目录Spring与SpringMVC父子容器关系 Spring与SpringMVC父子容器关系 Spring和SpringMVC的容器具有父子关系,Spring容器为父容器,SpringMVC为子容器,子容器可以引用父容器中的Bean,而父容器不可以引用子容器中的Bean。 参考: Spring与SpringMVC父子容器的关系与初始化 spring父子容器----子容器不能获取父容器的属性 ...

const_ 684

探究Spring和SpringMVC父子容器关系

兄弟萌,相信有很多人想不到 Spring 和 SpringMVC 是父子容器吧,hhh,下面我们来一探究竟。 一般做 SSM 框架项目时,扫描 @Controller 注解类的对象是在 SpringMVC 容器中。而扫描 @Service、@Component、@Repository 等注解类的对象都是在 Spring 容器中。有没有兄弟想过这是为什么呢? Spring 和 SpringMVC 是有父子容器关系的,而且正是因为这个才往往会出现包扫描的问题。Spring是父容器,SpringMVC 是子容器。

devilzcl的博客 528

spring和springmvc父子容器概念介绍

https://www.cnblogs.com/grasp/p/11042580.html 转载地址:spring与springmvc父子容器_Spring教程_田守枝Java技术博客 1、spring和springmvc父子容器概念介绍 在spring和springmvc进行整合的时候,一般情况下我们会使用不同的配置文件来配置spring和springmvc,因此我们的应用中会存在至少2个ApplicationContext实例,由于是在web应用中,因此最终实例化的是ApplicationCo

yygr的博客 269

Spring与SpringMVC父子容器的关系与初始化

Spring和SpringMVC的容器具有父子关系,Spring容器为父容器,SpringMVC为子容器,子容器可以引用父容器中的Bean,而父容器不可以引用子容器中的Bean。了解了Spring与SpringMVC父子容器的关系,接下来让我们看看Spring与SpringMVC容器的初始化过程。以下讲解使用的web.xml文件如下: &lt;context-param&gt; ...

菜到怀疑人生的博客 1万+

手撕spring和springmvc父子容器

一、背景 Spring和SpringMVC是有父子容器关系的,而且正是因为这个才往往会出现包扫描的问题,我们在此来分析和理解Spring和SpringMVC的父子容器关系并且给出Spring和SpringMVC配置文件中包扫描的官方推荐方式。 二、概念理解和知识铺垫 在Spring整体框架的核心概念中,容器是核心思想,就是用来管理Bean的整个生命周期的,而在一个项目中,容器不一定只有一个,Spring中可以包括多个容器,而且容器有上下层关系,目前最常见的一种场景就是在一个项目中引入Spring和Sprin

程序员麦冬的博客(公众号同名) 305

spring和springMVC的父子容器

一、背景   最近由于项目的包扫描出现了问题,在解决问题的过程中,偶然发现了Spring和SpringMVC是有父子容器关系的,而且正是因为这个才往往会出现包扫描的问题,我们在此来分析和理解Spring和SpringMVC的父子容器关系并且给出Spring和SpringMVC配置文件中包扫描的官方推荐方式。 二、概念理解和知识铺垫   在Spring整体框架的核心概念中,容器是核心思想,就是...

xajh_czbk的博客 137

Spring和SpringMVC父子容器关系初窥

  这样我们在清楚了spring和springMVC的父子容器关系、以及扫描注册的原理以后,根据官方建议我们就可以很好把不同类型的Bean分配到不同的容器中进行管理。再出现Bean找不到或者SpringMVC不能跳转以及事务的配置失效的问题,我们就可以很快的定位以及解决问题了。很开心,有木有~...

zouduchen的博客 556
上一篇: FastDFS+Nginx之FastDFSClient的使用
下一篇: JavaWeb知识点总结
章 鱼
博客等级 码龄10年 203粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值