昨天,给数据组写接口,不小心掉进坑里挣扎了半天,最后发现是spring和springmvc它们虽是父子但并不和谐,于是在此一记。

Spring和SpringMVC作为Bean管理容器和MVC层的默认框架,已被众多WEB应用采用,而在实际开发中,由于有了强大的注解功能,很多基于XML的配置方式已经被替代,但在实际项目中,我们经常会同时配置Spring和SpringMVC的配置文件,分层来管理它们,但是有时候就会出现那么一些奇怪的异常,一旦进坑,让你无法自拔,就在昨天给数据组写接口时,我进坑了,就在坑里浑浑噩噩得度分如年,虽然当时很难受很浮躁,但是此刻在总写这篇博文时我心里是很高兴的,真的各位。

首先,我得帮助大家理解一下父子容器(2个容器)以及它们是如何初始化的,还有就是它们父子如何共享bean资源的。打个比方:老子的资产儿子可以使用,但是儿子的财产老子一般是不使用的;反过来说,Spring父容器中对于SpringMVC子容器中的bean是不可见的,反之,子容器中对于父容器中的bean是可见的。意思就是这个意思,这些概念我也是这俩天才脑补的,以前也没个正形,各位将就读读吧,文章末尾是我专门去给各位扒的美图,请各位慢用(是关于父子容器中bean的可见性和web容器如何初始化它们的)。

到这儿,我废话不多说了,直接给大家把我昨天进坑和出坑的场景简单描述一下。

场景一:由父子容器参与的项目中开启定时任务,由于包扫描的范围大小,儿子的定时任务失效了?各位他们虽为父子,但是也不和谐啊,你以为是相亲相爱一家人资源共享啊,我滴孩啊不是的。在springmvc的核心配置文件中扫描了com.zxz.action包结构,在spring的管理配置文件中首先开启了扫描定时任务的注解配置<task:annotation-driven />,然后扫描了com.zxz.service包结构,但是没有触及到子容器的地盘,这下坏了这蒙在鼓里的我菜鸟,同时开启俩个世界的定时任务,还在傻傻的打开控制台等着执行呢,但是只有爹的定时任务如愿以偿,但是儿子的定时任务挂了,.........经过一段时间的纠结,发现了问题,因为它们是2个容器,2个容器啊,不是你在这个容器里配置了,就代表那个容器也会生效啊,不会的,你得分清,爹的是爹的,儿子的是儿子的。

项目包结构如下:

service层的定时任务:

1      /**
2 * 开启Spring容器扫描包范围内的定时任务
3 */
4 @Scheduled(cron = "0/3 * * * * ? ")
5 public void serviceTask(){
6 System.out.println("Service**********");
7 }

controller层的定时任务:

1      /**
2 * 开启SpringMVC容器扫描包范围内的定时任务
3 */
4 @Scheduled(cron = "0/6 * * * * ? ")
5 public void webTask(){
6 System.out.println("Controller**********");
7 }

儿子的定时任务没有执行的配置:

1 <!-- task任务扫描注解 -->
2 <task:annotation-driven />
3
4 <!-- 开启Spring容器的包扫描 -->
5 <context:component-scan base-package="com.zxz.service"/>

扩大定时任务扫描的包结构的配置:

1 <!-- task任务扫描注解 -->
2 <task:annotation-driven />
3
4 <!-- 开启Spring容器的包扫描 -->
5 <context:component-scan base-package="com.zxz"/>

场景二:由父子容器参与的项目中加载配置文件中的常量值,由于疏忽导致在父容器的配置文件中没有配置加载资源文件的那项配置,在service层的代码中始终没有获取到相关常量的值?上面说了,2个容器各自使用各自的。我们在开发中经常有这么一个动作,就是将项目中不变的常量和它们的值都习惯存储到某个资源文件中,如果在代码中需要使用它们的值则可以直接获取,不用再去代码中查找到对应的常量并修改他们的值,那是愚蠢的做法,极其不方便,聪明人都是会提取出来的为了修改方便维护方便。我这个项目里所有的常量和它们值都放在resource.propertie资源文件里了,但是由于我的忽视,我高看了spring他们一家人的关系,导致我service层的代码一直报NullPointerException异常,让我断点调试卡了半天.......哎,最后发现我没有在父容器的配置文件中没有配置加载项,我彻底恍惚了,不知道自己是大意还是菜,总之这些就是一些非常细微的细节,各位。

controller层和service层同时加载常量(如果使用spring和springmvc来作为容器,则记得同时配置哦):

父子容器中加载资源文件的配置:

 <!-- 加载java资源文件 -->
<context:property-placeholder location="classpath*:properties/*.propertie"/>

好了各位,我分享的东西暂时就这么多,因为我有把握的就这么多,但是我从网上看到父子容器导致的问题还很多,比如可以让事务失效啊什么的,菜鸟在进一步探索,如果有结果会给各位准时报告的。如果博文中有什么不对的地方,请留言,我会及时查证并修改的,谢谢各位的捧场(还有别忘了看图)。

图一:父子容器中bean的可见性。

图二:父子容器的初始化情况。

Spring和SpringMVC父子的容器之道---[上篇]的更多相关文章

  1. Spring和SpringMVC父子容器关系初窥

    一.背景 最近由于项目的包扫描出现了问题,在解决问题的过程中,偶然发现了Spring和SpringMVC是有父子容器关系的,而且正是因为这个才往往会出现包扫描的问题,我们在此来分析和理解Spring和 ...

  2. Spring和springMVC父子容器的关系

    部分转载自:https://www.cnblogs.com/ljdblog/p/7461854.html springMVC容器和Spring容器 为什么一定要在web.xml中配置spring的li ...

  3. spring与springmvc父子容器

    转载地址:http://www.tianshouzhi.com/api/tutorials/spring 1.spring和springmvc父子容器概念介绍 在spring和springmvc进行整 ...

  4. (转载)Spring与SpringMVC父子容器的关系与初始化

    转自 https://blog.csdn.net/dhaiuda/article/details/80026354 Spring和SpringMVC的容器具有父子关系,Spring容器为父容器,Spr ...

  5. 1、spring与springmvc父子容器

    转载于http://www.tianshouzhi.com/api/tutorials/spring 1.0 spring与springmvc父子容器 1.spring和springmvc父子容器概念 ...

  6. spring和springmvc父子容器关系

    一般来说,我们在整合spring和SpringMVC这两个框架中,web.xml会这样写到: <!-- 加载spring容器 --> <!-- 初始化加载application.xm ...

  7. 面试高频题:说一说对Spring和SpringMvc父子容器的理解?

    引言 以前写了几篇关于SpringBoot的文章<面试高频题:springBoot自动装配的原理你能说出来吗>.<保姆级教程,手把手教你实现一个SpringBoot的starter& ...

  8. 转:spring的启动过程-spring和springMVC父子容器的原理

    要想很好理解这三个上下文的关系,需要先熟悉spring是怎样在web容器中启动起来的.spring的启动过程其实就是其IoC容器的启动过程,对于web程序,IoC容器启动过程即是建立上下文的过程. s ...

  9. Spring和springmvc父子容器注解扫描问题详解

      一.Spring容器和springmvc容器的关系如下图所示: Spring和springmvc和作为两个独立的容器,会把扫描到的注解对象分别放到两个不同的容器中, Springmvc容器是spr ...

随机推荐

  1. canvas动画——粒子系统(1)

    这个动画在很早之前就见过,当时就没迷住了.最近在学canavs动画,动手实现了一下.代码在这里.展示效果在这里. 这属于粒子系统的一种,粒子系统就是需要管理一堆粒子嘛,动画实现的关键在于,遍历这些粒子 ...

  2. IntelliJ IDEA 2017.1.4 x64配置说明

    只是为了研究下idea这款编译器怎么使用.开门见山,说下如何配置这款编译器,不配置也能用,但是强迫症表示不服.下面直入正题: 下载与安装就不说了,除了更改安装目录外,没啥注意的地方,建议下载idea去 ...

  3. MVC架构简介及其测试策略

    最近在WEB端测试工作中陷入了瓶颈,单纯的手动功能测试在没有成熟的代码规范之前还是很容易坑的,WEB自动化测试一时半会还没有什么进展,所以决定先学习一下网站用的MVC架构,跟着教程写了一个小网站,大概 ...

  4. [转] .NET领域驱动设计—实践(穿过迷雾走向光明)

    阅读目录 开篇介绍 1.1示例介绍 (OnlineExamination在线考试系统介绍) 1.2分析.建模 (对真实业务进行分析.模型化) 1.2.1 用例分析 (提取系统的所有功能需求) 1.3系 ...

  5. scrapy设置"请求池"

    scrapy设置"请求池" 引言 相信大家有时候爬虫发出请求的时候会被ban,返回的是403错误,这个就是请求头的问题,其实在python发出请求时,使用的是默认的自己的请求头,网 ...

  6. drozer使用

    1.启用adb 端口转发 adb forward tcp:314154 tcp:31415 2.启用drozer 3.链接drozer drozer console connect     4:如果没 ...

  7. oracle学习笔记(2)-基本术语

    oracle基本术语 先上图. 相当粗糙的一个图,可能有些地方不够精细,大致结构基本是对的. 逻辑结构上从大到小的依次为文件(file)->表空间(tablespace)->段(segme ...

  8. UE4 difference between servertravel and openlevel(多人游戏的关卡切换)

    多人游戏的关卡切换分为无缝和非无缝.非无缝切换时,客户端将跟服务器断开连接,然后重新连接到同一个服务器,服务器则加载一个新地图.无缝切换不会发生这样的情况. 有三个函数供我们使用:UEngine::B ...

  9. sqlserver 复制表结构(可以含有数据 或 只要表结构)

    sqlserver 复制表结构(可以含有数据 或 只要表结构) SELECT * INTO bb FROM aa(NOLOCK) WHERE 1=0

  10. PHP中小小的header函数

    不废话,直接说功能 1.重定向,语法: header("location:http://www.lemon-x.ga"); file_put_contents("./te ...