面试必背之Spring和SpringMVC父子容器问题(父子容器污染)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 🍅程序员小王的博客:程序员小王的博客🍅 欢迎点赞 👍 收藏 ⭐留言 📝🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕🍅java自学的学习路线:java自学的学习路线

1、容器

Spring项目管理框架 核心作用:组件的创建,使用,销毁对象


2、父子容器

Spring容器

SpringMVC基于Spring开发的控制器框架 本质:也是容器也能创建,使用,销毁对象


3、两个容器:Spring SpringMVC

SSM:Struts2+Spring+Mybatis只有一个容器

现有的SSM整合Spring+SpringMVC+Mybatis 有两个容器


4、父子容器 就是Spring和SpringMVC的关系

Spring是父容器

SpringMVC是子容器


5、父子容器的特点

父容器中的组件 可以共用,子容器的组件只有自己能用,同时子容器内部组件只有容器可用,而且优先使用自己的组件


6、父子容器污染

  父容器:<context:component-scan base-package="com.tjcu"></context:component-scan>
  子容器: <context:component-scan base-package="com.tjcu"></context:component-scan>

如果父子容器的组件扫码都扫码位置一样就会出现父子容器污染,都会同时创建Controller,Service对象


8.png

问题:

1、父子容器会创建相同的组件,浪费存储资源

2、子容器使用没有添加事务控制的Service实现类 从而丢失数据,额外功能和事务控制


7、解决方案

解决方法的核心:父容器只扫描Dao,Servie,子容器只扫描Controller相关


9.png


方案一:父容器扫码全部,子容器只扫描Controller相关组件

方案二、父子容器都扫描根【企业,开发,面试必背】

通过修改扫描策略来指定各个容器的扫描范围


父容器

  <!--1、注入组件扫码-->
    <context:component-scan base-package="com.tjcu">
        <!--排除过滤 annotation:通过注解过滤 expression:注解的全限定-->
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>


子容器(use-default-filters:关闭默认扫描策略)

   <!-- 1、开启注解组件 扫码 use-default-filters:关闭默认扫描策略-->
    <!--默认扫描:@Repository, @Service,@Controller, @RestController, @ControllerAdvice-->
    <context:component-scan base-package="com.tjcu" use-default-filters="false">
        <!--包含过滤 Controller层-->
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
相关文章
|
1月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
1月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
339 2
|
5月前
|
设计模式 算法 架构师
京东二面:说下spring中常用的设计模式? (一个 深入骨髓的答案, 面试官跪下了)
京东二面:说下spring中常用的设计模式? (一个 深入骨髓的答案, 面试官跪下了)
京东二面:说下spring中常用的设计模式? (一个 深入骨髓的答案, 面试官跪下了)
|
XML Java 数据格式
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
|
6月前
|
XML Java 数据格式
Spring IoC容器的设计与实现
Spring 是一个功能强大且模块化的 Java 开发框架,其核心架构围绕 IoC 容器、AOP、数据访问与集成、Web 层支持等展开。其中,`BeanFactory` 和 `ApplicationContext` 是 Spring 容器的核心组件,分别定位为基础容器和高级容器,前者提供轻量级的 Bean 管理,后者扩展了事件发布、国际化等功能。
|
8月前
|
网络协议 Shell 网络安全
面试官想听的不仅是命令——如何结构化回答“容器无Shell时如何测试外网”?
“说说看,如果一个Pod的容器没有Shell,如何测试它能否访问外网?”
面试官想听的不仅是命令——如何结构化回答“容器无Shell时如何测试外网”?
|
9月前
|
XML Java 数据格式
Spring容器的本质
本文主要讨论Spring容器最核心的机制,用最少的代码讲清楚Spring容器的本质。
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!