`
chenshangge
  • 浏览: 88008 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类

关于spring与springMVC容器初始化的一些探讨

 
阅读更多

本人刚开始接触spring与springMVC不久,最开始配置service项目时遇到一个问题:在rootconfig下配置spring扫描bean的路径包含了controller,然后在webconfig中不配置扫描controller的路径,发现在tomcat启动时,确实初始化了controllerBean并且存放在了rootWebapplicationContext上。但是请求接口时却发现请求不到任何接口。如果在webconfig上配置controller扫描路径,就能请求到controller中的接口。但是做了一个测试,在某个控制器的构造器中写了控制台打印“111”,tomcat启动时会发现控制台打印了2次也就是说控制器bean被创建了两次。那么倒是怎么回事?

 

 

从网上的一些资料的做法看到,就是说rootconfig中配置扫描路径要排除controller的路径,在webconfig只扫描controller的路径,如果扫描了service,那么service的事务功能就失效了。具体原因说法不一,一种可靠说话是子上下文优先与父上下文,子上下文中的service没有事务功能。

 

 

后来查看源码大概了解其机制,下面一一阐述。

首先看到tomcat启动时控制台:


 图中
1-2:是创建spring扫描的bean,存放在RootWebapplicationContext
图中3:我们看到还有一个webapplicationContext,它的父上下文是RootWebapplicationContext

 

也就是说是一共有2webapplicationContextnamespacedispatcher-servlet是子上下文。

我们来看DispatcherServlet的父类FramworkServletconfigureAndRefreshWebApplicationContext方法



 

Debug发现   方法入参的wac就是 RootWebapplicationcontext,但是在这个方法中,getServletNamedispatcher-servlet,并通过setId以及setServletContext等等后面的几个方法把wac设置了namespacedispatcher-sevletwebapplicationContext,也就是说这个名叫namespacedispatcher-servlet的子上下文取代了原先RootWebapplicationContext的地位,其parentRootWebapplicationContext.

 

我们再来看Dispatcher-servletinitHandlerMapping方法

 

 

 



 

这个时候的入参context就是子上下文名叫dispatcher-servletWebapplicationContext,从这里看出,初始化HandlerMappings只是从namespacedispatcher-servletwebapplicationContext中去取Bean

 

按照我自己的理解,子上下文已经取代了root上下文的位置。所以spring在注入其他bean的时候,会先从dispatcher-servletwebapplicationContext中去找对应的bean,如果找不到,才去其parentrootWebapplicationContext中去找bean。这样也解释了,为什么webconfig扫描了serviceservice的事务功能的没有了。因为子上下文和父上下文中都存放了serviceBean

 

得出结论:spring扫描与springMVC扫描避免重复。SpringMVC只用扫描控制器类的包。Spring扫描除控制器以外的类包

 

 

  • 大小: 189.5 KB
  • 大小: 123.1 KB
  • 大小: 153.2 KB
分享到:
评论
1 楼 lesliewong 2016-09-22  

相关推荐

    Spring+SpringMVC+Hibernate+JSP框架搭建

    1. **初始化Spring容器**:应用启动时,Spring容器加载配置文件,初始化Bean并进行依赖注入。 2. **配置SpringMVC**:设置DispatcherServlet,定义处理器映射器和视图解析器,处理HTTP请求,并将控制权交给SpringMVC...

    spring+springMVC所需的包

    标题中的"spring+springMVC所需的包"表明这是一个关于整合Spring框架和Spring MVC的开发环境配置。这些包是构建基于Java的Web应用程序所必需的,主要用于处理服务层、控制层和数据访问层的交互。接下来,我们将深入...

    SSM框架【Spring+SpringMVC+MyBatis】 源码

    - Spring的IoC容器是如何管理和初始化各个组件的。 - SpringMVC的DispatcherServlet如何处理请求和响应。 - MyBatis的Executor、StatementHandler和ParameterHandler等组件如何协同工作执行SQL。 - SSM框架间的接口...

    spring+springmvc+mybatis web项目

    1. **启动阶段**:项目启动时,Spring容器初始化,加载配置文件,创建并管理所有Bean,包括SpringMVC的DispatcherServlet、Controller、Service和MyBatis的SqlSessionTemplate等。 2. **请求处理**:用户发送HTTP...

    maven 整合spring springmvc ibatis

    在IT领域,构建大型企业级应用时,常常会采用一系列技术框架进行...在实际项目中,还可以结合其他组件,如Spring Security进行权限管理,Spring Boot简化项目初始化,MyBatis Plus增强iBatis功能,进一步优化开发流程。

    spring+springmvc+hibenate完整例子

    7. **SQL脚本**:在根目录下,包含了数据库的创建和初始化脚本,用于建立与项目匹配的数据库结构。 这个例子的价值在于它提供了一个完整的、可运行的示例,帮助开发者理解如何将Spring、SpringMVC和Hibernate集成在...

    spring+springMVC+mybatis整合包

    3. **Bean管理**:Spring容器管理Bean的创建、初始化、销毁,以及它们之间的依赖关系。 二、SpringMVC框架 1. **Model-View-Controller模式**:SpringMVC遵循MVC设计模式,分离业务逻辑、数据和用户界面。 2. **...

    SSM.zip_mybatis_spring_springMVC mybatis_springmvc_ssm

    Spring的核心是IoC容器,它负责创建对象、管理对象之间的关系,并执行初始化和配置。 **SpringMVC** 是Spring框架的一部分,专门用于构建Web应用程序的模型-视图-控制器(Model-View-Controller,MVC)架构。它提供...

    SSM框架--(Spring+SpringMVC+Mybatis整合)

    数据库连接通常使用JDBC驱动,配合MySQL数据库,通过配置数据源、事务管理器以及Mybatis的相关配置文件,完成项目的初始化工作。 项目0_ssm可能包含以下结构:src/main/java目录下存放Java源代码,包括Service、DAO...

    spring+springmvc 纯框架涵数据库

    标题 "spring+springmvc 纯框架涵数据库" 指出我们要探讨的是Spring框架与Spring MVC框架在处理数据存储方面的一个集成应用。Spring是一个全面的Java企业级应用开发框架,它提供了依赖注入(Dependency Injection,...

    非注解Springmvc+spring+hibernate 入门实例

    下面我们将深入探讨"非注解SpringMVC+Spring+Hibernate入门实例"中的关键知识点。 首先,让我们从SpringMVC开始。SpringMVC是一个Model-View-Controller架构模式的实现,用于构建Web应用程序。在非注解方式下,我们...

    Spring-SpringMVC-MyBatis-Shiro整合

    4. 整合测试:使用shiro.sql这样的数据库脚本初始化用户和角色信息,确保Shiro可以正确识别和验证用户。 这个小案例可能是通过创建一个简单的Web应用,演示如何配置和使用这些组件。开发者可能通过Spring-Shiro-...

    SpringMVC精品资源--JAVA、Spring、SpringMVC、SpringBoot、Mybatis、Vu.zip

    【标题】"SpringMVC精品资源--JAVA、Spring、SpringMVC、SpringBoot、Mybatis、Vue.zip" 提供的是一份综合性的IT学习资源,涵盖了Java开发中的多个关键框架和技术,包括Spring、SpringMVC、SpringBoot以及Mybatis,...

    日常学习Demo集合,包括Spring、SpringMVC、SpringBoot、SpringData、MyBatis

    本文将深入探讨标题和描述中提到的几个关键知识点:Spring、SpringMVC、SpringBoot、SpringData以及MyBatis和MyBatisPlus。 首先,Spring是一个开源的Java应用程序框架,它为开发人员提供了强大的依赖注入(DI)和...

    SpringMVC+Spring+HIbernate增删改查

    在项目中,`blogarticle.sql`文件很可能是数据库初始化脚本,用于创建博客文章相关的表结构,可能包括文章ID、标题、内容、作者等字段。在应用启动时,这个脚本会被执行,建立必要的数据库环境。 而`Blog`文件可能...

    spring4+springmvc4+hibernate4 整合DEMO

    2. **初始化Spring**:创建Spring的配置文件(如applicationContext.xml),配置Bean,包括DataSource、SessionFactory、HibernateTemplate或JpaTemplate等。 3. **配置SpringMVC**:创建SpringMVC的配置文件(如...

    springmvc+mybatis整合项目

    项目中的SQL脚本和数据初始化文件可以帮助快速搭建数据库环境并填充数据。 6. **整合优势** 整合SpringMVC和MyBatis的优势在于: - **解耦合**:通过Spring的依赖注入,降低了不同组件之间的耦合度。 - **灵活性...

    SpringMVC+Spring+hibernate 教程

    - 在配置文件中,确保servlet类名、别名、初始化参数等正确无误。 - 在配置数据源时,需要确保数据库驱动、连接URL、用户名、密码等信息正确无误,且数据库服务需要启动。 - 在编写实体类时,正确使用注解或XML配置...

    一个基于Java、Spring、SpringMVC、Mybatis、MySQL的伙伴云表格系统。.zip

    通常,这些文件会按照模块进行组织,例如src/main/java目录下存放Java源码,src/main/resources包含配置文件,而db脚本则用于初始化数据库。 开发这样的系统,开发者需要掌握以下技能: - Java编程基础,包括面向...

    Spring+SpringMVC+JDBC实现登录的示例(附源码)

    在本文中,我们将深入探讨如何使用Spring、SpringMVC和JDBC实现一个基本的登录功能。这个示例将涵盖从创建项目结构、配置环境到编写代码的整个过程,旨在帮助初学者理解和掌握这些核心技术。 首先,我们需要搭建...

Global site tag (gtag.js) - Google Analytics