背景和概述

在spring与springMVC中通过IOC可以管理bean对象,有两个配置文件可以配置ioc

spring的配置文件applicationContext.xml
springMVC的配置文件springMVC.xml
工作中我们用spring来管理service层和repertory层的bean对象,而让springMVC去管理controller。
  
那么很自然有如下的疑问?

1、能不能用springMVC的配置文件springMVC.xml来管理全部的bean对象,包括controller,service,dao?
2、能不能用spring的配置文件applicationContext.xml来管理全部的bean对象,包括controller,service,dao?
答案是这样的

  完全可以用在spingMVC的而配置文件中来管理全部的Bean对象,但是不可以用spring来管理controller。

为什么是这样的?

Spring和SpringMVC父子容器关系

  在Spring整体框架的核心概念中,容器是核心思想,就是用来管理Bean的整个生命周期的,而在一个项目中,容器不一定只有一个,Spring中可以包括多个容器,而且容器有上下层关系,目前最常见的一种场景就是在一个项目中引入Spring和SpringMVC这两个框架,那么它其实就是两个容器,Spring是父容器,SpringMVC是其子容器,并且在Spring父容器中注册的Bean对于SpringMVC容器中是可见的,而在SpringMVC容器中注册的Bean对于Spring父容器中是不可见的,也就是子容器可以看见父容器中的注册的Bean,反之就不行。

spring与springMVC的细节问题

   spring是一个IOC容器,springMVC可以看做是一个springIOC容器的一个子容器,这个子容器有自己独有的逻辑和方法。其其中很重要的有:HandlerMapper(处理器映射器),和HandlerAdapter(处理器适配器),其配置如下:

<!-- 配置最新版的注解的处理器映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
<!-- 配置最新版的注解的处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
1
2
3
4
  或者可以利用注解驱动去自动加载。

<!-- 注解驱动:
作用:替我们自动配置最新版的注解的处理器映射器和处理器适配器
-->
<mvc:annotation-driven></mvc:annotation-driven>
1
2
3
4
  值得注意的是,springMVC在调用HandlerMapper进行url到controller函数方法映射解析的时候,HandlerMapper会在springMVC容器中寻找controller,也就是在子容器中寻找,不会去父容器spring容器中寻找的,所以当用spring的applicationContext.xml中配置了controller后,在访问页面的时候会出现404错误。

我们来总结一下
  这样我们在清楚了spring和springMVC的父子容器关系、以及扫描注册的原理以后,根据官方建议我们就可以很好把不同类型的Bean分配到不同的容器中进行管理。再出现Bean找不到或者SpringMVC不能跳转以及事务的配置失效的问题

https://blog.csdn.net/u010758410/article/details/79950801

在说父子容器之前,咱们首先了解什么是容器:

java容器:

可以管理对象声明周期,对象间的依赖关系。还可以配置对象名称,属性,产生方式等。不用程序员自己编写程序来管理。

java中常用的容器类有:List、HashMap、HashTable等。

spring容器:

借用以为博主的总结:

spring有两个核心接口:BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子接口。他们都可代表Spring容器,Spring容器是生成Bean实例的工厂,并且管理容器中的Bean。

Bean是Spring管理的基本单位,在基于Spring的Java EE应用中,所有的组件都被当成Bean处理,包括数据源、hibernate的SessionFactory、事务管理器等。在Spring中,Bean的是一个非常广义的概念,任何的Java对象、Java组件都被当成Bean处理。

了解了什么是容器,接下来就进入正题:

在一个项目中,容器不一定只有一个,就拿我正在学习的ssm框架来说:spring可以包含多个容器,比如说springmvc容器。在搭建项目的时候我们做了好多的配置:

比如:在springmvc.xml中配置了一个扫描包,扫描controller中的注解。(后边的mvc:annotation-driven代表使用注解驱动,可以不写)

又比如:在service.xml中配置了扫描包,要扫描service中的注解

那问题就来了,既然spring容器是一个大的容器,那我可不可以,写一个全局扫描包把service/dao/controller都扫描到spring容器中呢?这样会不会更方便一点不用配置那么多的xml文件?

针对这个问题,我们一起来学习一下:

Spring 是一个容器,springmvc也是一个容器。他们两者之间是父子容器关系。springmvc是子容器,包含在spring容器中。在项目中的配置如下:

我们在web.xml中配置了一个spring容器:用Listener加载初始化srping容器(这是一个大的容器)

还配了一个springmvc的前端控制器:(这是一个包含在springmvc中的一个容器。而springmvc又包含在spring容器中)

就相当于:service.dao在spring容器中,controller在springmvc容器中。

父子容器约定如下:

1、子容器可以访问父容器中的对象:

也就是service 可以注入到controller中。

但反过来,controller就不可以注入到service中。

当然,如果controller和service在一个容器中,就可以注入。

2、父容器不可以访问子容器中的对象:

如果我们在spirng中配置一个全局的扫描包,spring容器会把service,controller,dao都扫描放入spring这个大的容器中。这样导致,springmvc中就没有对象了,页面访问找不到对应的controller,就会报404错误。

相反,如果我们在springmvc中写一个扫描包,把service、dao都注入到springmvc中,(也就是把spingmvc.xml中扫描包中的.controller去掉)是没有问题的。因为springmvc也是一个spring容器。

3、我们为什么要用spring加springmvc呢?

当然是为了系统以后的扩张方便。spring可以整合多个框架,这样我们后边如果想再加入一个struts到spring容器里面,也是可以的。

4、我们可不可以把事务配置到controller中?

如果是spirng+springmvc这个架构是不可以,因为事务管理器是在spring中配置的,在父容器中是访问不了springmvc子容器中的controller的。所以不可以。

但是如果把所有扫描包都配置到springmvc中,那么在controller是可以配置事务的。

所以结论如下:不可以在service.xml中配置一个全局扫描包来使用。

了解了父子容器,我们在搭建框架的时候,就会很容易的知道,我要配置什么,配置到哪些地方。就会更深一步的了解框架的原理。

课外拓展:

我在上网查询父子容器的时候,发现了两派配置容器的使用。

第一派:网友称为传统派,就是spring+springmvc的配置。和我上面讲的一样。没什么可说的

第二派:叫激进派,就是把所有东西都配置到springmvc中,不要service或者dao层的接口,把做项目一全套的数据源啦,事务啦,dao啦,service啦,都配置到子容器中。

https://blog.csdn.net/lishaoran369/article/details/57073715

spring与springMVC的父子容器关系的更多相关文章

  1. Spring 和SpringMVC 的父子容器关系

      Spring和SpringMVC作为Bean管理容器和MVC层的默认框架,已被众多WEB应用采用,而实际使用时,由于有了强大的注解功能,很多基于XML的配置方式已经被替代,但是在实际项目中,同时配 ...

  2. spring盒springMVC整合父子容器问题:整合Spring时Service层为什么不做全局包扫描详解

    整合Spring时Service层为什么不做全局包扫描详解 一.Spring和SpringMVC的父子容器关系 1.讲问题之前要先明白一个关系 一般来说,我们在整合Spring和SpringMVC这两 ...

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

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

  4. SpringMVC与Spring的父子容器关系

    问题: 在整合框架的时候有人也许会产生一个问题:能不能只配置一个扫描包加载实现类的扫描驱动,即在根目录下扫描所有的注解(@Controller.@Service.@Repository.@Compne ...

  5. 这一次搞懂Spring Web零xml配置原理以及父子容器关系

    前言 在使用Spring和SpringMVC的老版本进行开发时,我们需要配置很多的xml文件,非常的繁琐,总是让用户自行选择配置也是非常不好的.基于约定大于配置的规定,Spring提供了很多注解帮助我 ...

  6. spring和springmvc父子容器关系

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

  7. 03 Spring的父子容器

    1.概念理解和知识铺垫 在Spring整体框架的核心概念中,容器是核心思想,就是用来管理Bean的整个生命周期的,而在一个项目中,容器不一定只有一个,Spring中可以包括多个容器,而且容器有上下层关 ...

  8. Spring和SpringMVC的关系

    1.Spring和SpringMVC是父子容器关系. 2.Spring整体框架的核心思想是容器,用来管理bean的生命周期,而一个项目中会包含很多容器,并且它们分上下层关系,目前最常用的一个场景是在一 ...

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

    Spring和SpringMVC作为Bean管理容器和MVC层的默认框架,已被众多WEB应用采用,而在实际开发中,由于有了强大的注解功能,很多基于XML的配置方式已经被替代,但在实际项目中,我们经常会 ...

随机推荐

  1. Linux Kbuild文档(转)

    转载链接:http://blog.chinaunix.net/uid-10221131-id-2943265.html Linux Kbuild文档 Linux Kbuild文档 V 0.1 tang ...

  2. Odoo定时任务(自动任务)

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826270.html  一:定时任务模型 Odoo中内置了一个定时任务模型  ir.cron ,它定义了一 ...

  3. golang测试

    简述 Go语言中自带有一个轻量级的测试框架testing和自带的go test命令来实现单元测试和性能测试. go test [-c] [-i] [build flags] [packages] [f ...

  4. 一键配置树莓派wifi、静态ip等

    系统老是被我玩坏,重新烧录系统后配置又太麻烦,用shell脚本一键配置一下wifi和静态IP #!/bin/bash touch /media/fanghaoyu/boot/ssh echo &quo ...

  5. Httpd服务进阶知识-LAMP源码编译安装

    Httpd服务进阶知识-LAMP源码编译安装 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必大家都知道,动态资源交给fastcgi程序处理,静态资源依旧由httpd服务器处理  ...

  6. (十)Kubernetes ConfigMap和Secret

    ConfigMap资源 介绍 ConfigMap是让配置文件从镜像中解耦,让镜像的可移植性和可复制性.许多应用程序会从配置文件.命令行参数或环境变量中读取配置信息.这些配置信息需要与docker im ...

  7. 201671030111 李蓉 实验十四 团队项目评审&课程学习总结

    项目 内容 这个作业属于哪个课程 软件工程 这个作业的要求在哪里 实验十四 团队项目评审&课程学习总结 作业学习目标 掌握软件项目评审会流程,反思总结课程学习内容. 任务一:结合本学期课程学习 ...

  8. appuploader 使用

    mac 使用 Jar Lanucher.app 打开 解压后的 appuploader.jar 文件,即可启动 appuploader. 内容 网址 官方网站 http://www.appupload ...

  9. abp记录2

    AbpCoreInstaller只是完成注册系统框架级的所有配置类.Abp支持自动完成符合Conventional(基于约定)的组件的注册. Conventional 的规则要通过继承IConvent ...

  10. hive删除数据(转)

    转自:https://www.cnblogs.com/linn/p/6196293.html 按分区删除: ALTER TABLE test1  DROP PARTITION (dt='2016-04 ...