本人刚开始接触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
也就是说是一共有2个webapplicationContext,namespace为dispatcher-servlet是子上下文。
我们来看DispatcherServlet的父类FramworkServlet的configureAndRefreshWebApplicationContext方法
Debug发现 方法入参的wac就是 RootWebapplicationcontext,但是在这个方法中,getServletName为dispatcher-servlet,并通过setId以及setServletContext等等后面的几个方法把wac设置了namespace为dispatcher-sevlet的webapplicationContext,也就是说这个名叫namespace:dispatcher-servlet的子上下文取代了原先RootWebapplicationContext的地位,其parent为RootWebapplicationContext.
我们再来看Dispatcher-servlet的initHandlerMapping方法
这个时候的入参context就是子上下文名叫dispatcher-servlet的WebapplicationContext,从这里看出,初始化HandlerMappings只是从namespace:dispatcher-servlet的webapplicationContext中去取Bean;
按照我自己的理解,子上下文已经取代了root上下文的位置。所以spring在注入其他bean的时候,会先从dispatcher-servlet的webapplicationContext中去找对应的bean,如果找不到,才去其parent为rootWebapplicationContext中去找bean。这样也解释了,为什么webconfig扫描了service,service的事务功能的没有了。因为子上下文和父上下文中都存放了serviceBean。
得出结论:spring扫描与springMVC扫描避免重复。SpringMVC只用扫描控制器类的包。Spring扫描除控制器以外的类包
相关推荐
1. **初始化Spring容器**:应用启动时,Spring容器加载配置文件,初始化Bean并进行依赖注入。 2. **配置SpringMVC**:设置DispatcherServlet,定义处理器映射器和视图解析器,处理HTTP请求,并将控制权交给SpringMVC...
标题中的"spring+springMVC所需的包"表明这是一个关于整合Spring框架和Spring MVC的开发环境配置。这些包是构建基于Java的Web应用程序所必需的,主要用于处理服务层、控制层和数据访问层的交互。接下来,我们将深入...
- Spring的IoC容器是如何管理和初始化各个组件的。 - SpringMVC的DispatcherServlet如何处理请求和响应。 - MyBatis的Executor、StatementHandler和ParameterHandler等组件如何协同工作执行SQL。 - SSM框架间的接口...
1. **启动阶段**:项目启动时,Spring容器初始化,加载配置文件,创建并管理所有Bean,包括SpringMVC的DispatcherServlet、Controller、Service和MyBatis的SqlSessionTemplate等。 2. **请求处理**:用户发送HTTP...
在IT领域,构建大型企业级应用时,常常会采用一系列技术框架进行...在实际项目中,还可以结合其他组件,如Spring Security进行权限管理,Spring Boot简化项目初始化,MyBatis Plus增强iBatis功能,进一步优化开发流程。
7. **SQL脚本**:在根目录下,包含了数据库的创建和初始化脚本,用于建立与项目匹配的数据库结构。 这个例子的价值在于它提供了一个完整的、可运行的示例,帮助开发者理解如何将Spring、SpringMVC和Hibernate集成在...
3. **Bean管理**:Spring容器管理Bean的创建、初始化、销毁,以及它们之间的依赖关系。 二、SpringMVC框架 1. **Model-View-Controller模式**:SpringMVC遵循MVC设计模式,分离业务逻辑、数据和用户界面。 2. **...
Spring的核心是IoC容器,它负责创建对象、管理对象之间的关系,并执行初始化和配置。 **SpringMVC** 是Spring框架的一部分,专门用于构建Web应用程序的模型-视图-控制器(Model-View-Controller,MVC)架构。它提供...
数据库连接通常使用JDBC驱动,配合MySQL数据库,通过配置数据源、事务管理器以及Mybatis的相关配置文件,完成项目的初始化工作。 项目0_ssm可能包含以下结构:src/main/java目录下存放Java源代码,包括Service、DAO...
标题 "spring+springmvc 纯框架涵数据库" 指出我们要探讨的是Spring框架与Spring MVC框架在处理数据存储方面的一个集成应用。Spring是一个全面的Java企业级应用开发框架,它提供了依赖注入(Dependency Injection,...
下面我们将深入探讨"非注解SpringMVC+Spring+Hibernate入门实例"中的关键知识点。 首先,让我们从SpringMVC开始。SpringMVC是一个Model-View-Controller架构模式的实现,用于构建Web应用程序。在非注解方式下,我们...
4. 整合测试:使用shiro.sql这样的数据库脚本初始化用户和角色信息,确保Shiro可以正确识别和验证用户。 这个小案例可能是通过创建一个简单的Web应用,演示如何配置和使用这些组件。开发者可能通过Spring-Shiro-...
【标题】"SpringMVC精品资源--JAVA、Spring、SpringMVC、SpringBoot、Mybatis、Vue.zip" 提供的是一份综合性的IT学习资源,涵盖了Java开发中的多个关键框架和技术,包括Spring、SpringMVC、SpringBoot以及Mybatis,...
本文将深入探讨标题和描述中提到的几个关键知识点:Spring、SpringMVC、SpringBoot、SpringData以及MyBatis和MyBatisPlus。 首先,Spring是一个开源的Java应用程序框架,它为开发人员提供了强大的依赖注入(DI)和...
在项目中,`blogarticle.sql`文件很可能是数据库初始化脚本,用于创建博客文章相关的表结构,可能包括文章ID、标题、内容、作者等字段。在应用启动时,这个脚本会被执行,建立必要的数据库环境。 而`Blog`文件可能...
2. **初始化Spring**:创建Spring的配置文件(如applicationContext.xml),配置Bean,包括DataSource、SessionFactory、HibernateTemplate或JpaTemplate等。 3. **配置SpringMVC**:创建SpringMVC的配置文件(如...
项目中的SQL脚本和数据初始化文件可以帮助快速搭建数据库环境并填充数据。 6. **整合优势** 整合SpringMVC和MyBatis的优势在于: - **解耦合**:通过Spring的依赖注入,降低了不同组件之间的耦合度。 - **灵活性...
- 在配置文件中,确保servlet类名、别名、初始化参数等正确无误。 - 在配置数据源时,需要确保数据库驱动、连接URL、用户名、密码等信息正确无误,且数据库服务需要启动。 - 在编写实体类时,正确使用注解或XML配置...
通常,这些文件会按照模块进行组织,例如src/main/java目录下存放Java源码,src/main/resources包含配置文件,而db脚本则用于初始化数据库。 开发这样的系统,开发者需要掌握以下技能: - Java编程基础,包括面向...
在本文中,我们将深入探讨如何使用Spring、SpringMVC和JDBC实现一个基本的登录功能。这个示例将涵盖从创建项目结构、配置环境到编写代码的整个过程,旨在帮助初学者理解和掌握这些核心技术。 首先,我们需要搭建...