spring与springMVC的父子容器关系

背景和概述前端

在spring与springMVC中经过IOC能够管理bean对象,有两个配置文件能够配置iocjava

spring的配置文件applicationContext.xml
springMVC的配置文件springMVC.xml
工做中咱们用spring来管理service层和repertory层的bean对象,而让springMVC去管理controller。
  
那么很天然有以下的疑问?程序员

一、能不能用springMVC的配置文件springMVC.xml来管理所有的bean对象,包括controller,service,dao?
二、能不能用spring的配置文件applicationContext.xml来管理所有的bean对象,包括controller,service,dao?
答案是这样的web

  彻底能够用在spingMVC的而配置文件中来管理所有的Bean对象,可是不能够用spring来管理controller。spring

为何是这样的?架构

Spring和SpringMVC父子容器关系mvc

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

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容器中。

 

父子容器约定以下:

一、子容器能够访问父容器中的对象:

    也就是service 能够注入到controller中。

    但反过来,controller就不能够注入到service中。

    固然,若是controller和service在一个容器中,就能够注入。

 

二、父容器不能够访问子容器中的对象:

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

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

 

三、咱们为何要用spring加springmvc呢?

     固然是为了系统之后的扩张方便。spring能够整合多个框架,这样咱们后边若是想再加入一个struts到spring容器里面,也是能够的。

 

四、咱们可不能够把事务配置到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

相关文章
相关标签/搜索