昨天,给数据组写接口,不小心掉进坑里挣扎了半天,最后发现是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. php处理表单中的复选框问题以及js实现全选

    做的一个项目中遇到了全选和取消全选的问题,这是一个很普遍的功能,,虽然我们经常用到,但是真正做起来却发现行不通,在网上找了些,大部分都是ie,但是谷歌内核浏览器不能正常实现,所以经过小小的调整,今天就 ...

  2. yarn工作流程

    YARN 是 Hadoop 2.0 中的资源管理系统, 它的基本设计思想是将 MRv1 中的 JobTracker拆分成了两个独立的服务 : 一个全局的资源管理器 ResourceManager 和每 ...

  3. Day2 - Python基础2习题集

    1.购物车程序 product_list = [ (), (), (), (), (), (), ] shooping_list = [] salary = input("Input you ...

  4. HTML/XML/XPATH基础

    Html超文本标记语言 网页上单击右键→查看源文件/查看源代码 Html基本结构 <html>               为文档根元素,所有元素都在内部进行 <head>   ...

  5. jdbc的配置及jdbc连接常用数据库(mysql、sqlserver、Oracle)

    1.连接SQL Server数据库 import java.sql.*; publicclassMain{publicstaticvoid main(String[] args){String dri ...

  6. html5中cookie介绍,封装以及添加,获取,删除

    cookie是储存在用户本地终端上的数据. 在我们登陆网站时有记录密码,也有时间限制比如说7天,5天等等这都是我们利用cookie来写的, 这就是利用了cookie的会话周期,但cookie同时又是不 ...

  7. 聊聊vue组件开发的“边界把握”和“状态驱动”

    vue有着完整的组件化开发机制,但是官网只给了开发的方式,对于开发规范以及组件化开发的最佳实践,还需要我们来摸索.本文就平时开发中的经验来谈谈“把握边界”和“状态驱动”这两个话题. 边界把握 边界把握 ...

  8. angularjs下拉框实现渲染html

    angualrjs处于安全的考虑,插值 指令会对相应字符串进行过滤,避免出现html攻击.但是在一些时候,我们需要渲染html,比如实现一个分级的下拉框,代码如下: <body ng-app=& ...

  9. eclipse debug URLClassPath.getLoader(int) file

    版权声明:本文为博主原创文章,未经博主允许不得转载. URLClassPath.getLoader 在用Eclipse调试Java程序时,新手遇到的一个问题是断点老是执行不到,弹出URLClassPa ...

  10. AngularJS <a> 超链接标签不起作用?

    问题描述: Angular JS app中,使用超链接标签<a href='location'>click</a> 不起作用. 解决方法: 如果你不巧配置了$locationP ...