专栏首页禁心尽力Spring和SpringMVC父子的容器之道---[上篇]

Spring和SpringMVC父子的容器之道---[上篇]

昨天,给数据组写接口,不小心掉进坑里挣扎了半天,最后发现是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来作为容器,则记得同时配置哦):

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

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

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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • springmvc框架开发常用的注解总结

    1、@Controller使用:表示表现层中的JavaBean被spring容器管理。 2、@requestMapping使用:   a) 在方法上: 标记ur...

    赵小忠
  • XML技术之SAX解析器

    1.解析XML文件有三种解析方法:DOM SAX DOM4J。 2.首先SAX解析技术只能读取XML文档中的数据信息,不能对其文档中的数据进行添加,删除,修改操...

    赵小忠
  • 总结切面编程AOP的注解式开发和XML式开发

           有段日子没有总结东西了,因为最近确实有点忙,一直在忙于hadoop集群的搭建,磕磕碰碰现在勉强算是能呼吸了,因为这都是在自己的PC上,资源确实有点...

    赵小忠
  • 应聘3万的职位,有必要这么刁难我么?

    面试官:就是controller层交给一个spring容器加载,其他的service和dao层交给另外一个spring容器加载,web.xml中有这块配置,这两...

    路人甲Java
  • 如何为稳定的云堆栈构建基础?

    在我们完成云堆栈的构建工作——即实现平台即服务(简称PaaS)、规模化容器乃至开发工具集中的各类工具选项——之前,我们首先需要建立良好的操作系统基础以支持这些容...

    静一
  • 容器网络介绍分析

    本文部分内容译自《An Analysis and Empirical Study of Container Networks》

    灯塔大数据
  • 图文了解 Kubernetes

    最近,我开始了 Kubernetes 之旅,希望更好地了解其内部。下面简单介绍下吧!

    没有故事的陈师傅
  • 容器内的潘多拉——恶意代码

    从最基本的层面来讲,容器让你可以将更多的计算工作负载塞入到单单一台服务器上,并且让你可以在一瞬间为新的计算任务提高增加容量。从理论上来说,这意味着你可以购买较少...

    CNCF
  • 如何通过SSH进入正在运行的容器【Containers】

    容器已经改变了我们对虚拟化的思考方式。您可能还记得从虚拟化BIOS,操作系统和内核到每个虚拟化网络接口控制器(NIC)的虚拟机已满堆栈的日子(或者您可能还活着)...

    王欣壳
  • 以图形化的方式了解Kubernetes

    在我们尝试了解Kubernetes之前,让我们花一点时间来澄清容器是什么,以及它们为什么如此受欢迎。毕竟,在不知道容器是什么的情况下谈论容器编排器(Kubern...

    程序猿Damon

扫码关注云+社区

领取腾讯云代金券