昨天,给数据组写接口,不小心掉进坑里挣扎了半天,最后发现是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. 用NIO实现http协议

    先来看一下本篇博文的目录: 一:简介Nio 二:Nio的好处 三:关于http协议 四:代码实现 五:总结 一:简介Nio 我们都知道io流,那么NIO是什么呢?本篇博文将会带你一探NIO,NIO的全 ...

  2. 模拟对象测试——EasyMock

    一.EasyMock 使用动态代理实现模拟对象创建,一般可以满足以下测试需求 1.要测试的模块依赖于其它自己控制不了的模块,如第三方服务,其它组员在开发的服务等,它们都没办法配合你来测试: 2.涉及到 ...

  3. integer与int区别以及integer.values()方法详解

    声明:本文为博主转载文章,原文地址见文末. 知识点1:integer和int的区别 /* * int是java提供的8种原始数据类型之一.Java为每个原始类型提供了封装类,Integer是java为 ...

  4. Python: Pandas的DataFrame如何按指定list排序

    本文首发于微信公众号“Python数据之道”(ID:PyDataRoad) 前言 写这篇文章的起由是有一天微信上一位朋友问到一个问题,问题大体意思概述如下: 现在有一个pandas的Series和一个 ...

  5. AmpOne

    AmpOne 基于Windows平台的Apache .PHP.Mysql 开发环境 | One intergrated tools package of Apache + PHP + MySQL fo ...

  6. 设计模式(2)工厂方法模式(Factory Method)

    设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 源码地址 0 工厂方法模式简介 0.0 工厂方法模式定义 工厂方法模式是在简单工厂模式基础上,为解决更复杂的对象创建问题而衍生 ...

  7. R语言重要数据集分析研究——  数据集本身的分析技巧

    数据集本身的分析技巧           作者:王立敏           文章来源:网络 1.数据集 数据集,又称为资料集.数据集合或资料集合,是一种由数据所组成的集合. Data set(或dat ...

  8. Vulkan Tutorial 21 Staging buffer

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Introduction 顶点缓冲区现在已经可以正常工作,但相比于显卡内部读取数据, ...

  9. airdrop-ng/aircrack-ng

    找了很久,才找到安装方法跟使用,特此记录下来首先要安装好airodump-ng 1.2 beat那个版本我安装的前提是 airodump mon0 可以试用了.今天就不写airodump-ng安装了, ...

  10. JAVA基础——最简单的多重循环程序

    Java 循环语句之多重循环 循环体中包含循环语句的结构称为多重循环.三种循环语句可以自身嵌套,也可以相互嵌套,最常见的就是二重循环.在二重循环中,外层循环每执行一次,内层循环要执行一圈. 如下所示: ...