Spring和SpringMVC整合及关系
SpringMVC扼要的讲,就是控制请求和处理。有必要将Spring和SpringMVC整合,否则仅配置SpringMVC并完成Spring的功能,会造成业务逻辑混乱。
简要总结:①原理:采用监听器,可以在ServlertContext加载时,通过监听器加载Spring的配置文件,创建Spring容器。②Spring提供的监听器ContextLoaderListener (可以不用自己创建监听器)。下面为详细分析:
1、整合分析(模拟原理,SpringMVC可以通过在web.xml中直接配置监听器):
①在配置文件中加入Spring的配置文件。但需要考虑,web容器启动以后,Spring的配置文件不会自动加载。加载需要ApplicationContext调用其实现类ClassPathXmlApplicationContext的构造方法,实现Spring配置文件的加载。
②Spring配置文件什么时候加载?怎么加载?
Spring配置文件的一定需要在web项目启动时加载,而且必须在Servlet配置前加载(为控制层的自动装载做准备,SpringMVC所管理的控制层依赖于Spring管理的service业务逻辑层)。采用监听器Listener(监听在web程序执行中的一些事件,比如ServletContext的生命周期,或者某一属性是否变化,监听的是一个动作)。ServlertContext,在web项目启动时就会创建。因此,可以创建一个监听器,来监听ServletContext的生命周期,一旦ServletContext创建,就去加载Spring的配置文件。
注意的问题:
1)SpringMVC和Spring配置文件,如果都配置包的扫描,可能会导致有的bean被创建2次。解决办法,在Spring配置文件扫描中去除控制层的扫描:
<context:component-scan base-package="com.atguigu">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
2)在监听器加载Spring配置文件时,在ServletContext中绑定ApplicationContext对象,从而能够在控制层中使用Spring管理的bean。
package com.atguigu.listener; import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; /**
* Application Lifecycle Listener implementation class SpringListener
*
*/
public class SpringListener implements ServletContextListener { /**
* Default constructor.
*/
public SpringListener() {
// TODO Auto-generated constructor stub
} /**
* @see ServletContextListener#contextDestroyed(ServletContextEvent)
*/
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
} /**
* @see ServletContextListener#contextInitialized(ServletContextEvent)
*/
public void contextInitialized(ServletContextEvent sce) {
ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
ServletContext servletContext = sce.getServletContext();
servletContext.setAttribute("ac", ac);
} }
package com.atguigu.controller; import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession; import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; import com.atguigu.bean.Teacher; @Controller
public class TestController { @RequestMapping("/testListener") //返回void,回去寻找与请求名一致的视图,即testListener。但实际中不会有void的情况
public void testListener(HttpSession session) {
//获取spring所管理的teacher对象
ServletContext servletContext = session.getServletContext();
ApplicationContext ac = (ApplicationContext)servletContext.getAttribute("ac");
Teacher teacher = ac.getBean("teacher", Teacher.class);
System.out.println(teacher);
} }
Spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- <bean id="user" class="com.atguigu.bean.User"></bean> -->
<context:component-scan base-package="com.atguigu">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan> <bean id="teacher" class="com.atguigu.bean.Teacher"></bean> </beans>
2、SpringMVC配置:(建议使用)
1)、包扫描(排除控制层)
2)、配置监听器 ContextLoaderListener

<!-- needed for ContextLoaderListener ,该配置表示Spring的配置spring.xml文件在类路径下,context-param标签表示项目启动时加载-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param> <!-- Bootstraps the root web application context before servlet initialization -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
注意:Spring的配置文件有默认的名字和位置,在WEB-INF文件下,名为applicationContext.xml
错误:BeanFactory not initialized or already closed,出现的三种情况:
①Spring的配置文件找不到(路径或名称不对)
②Spring的配置文件没有创建
③Spring文件中出现了语法错误
Spring和SpringMVC关系
Spring为父容器,SpringMVC为子容器。
规定:子容器能够调用访问父容器中的bean,而父容器不能调用访问子容器中的bean.
SpringMVC | Spring
Controller | service dao
Spring和SpringMVC整合及关系的更多相关文章
- Spring+MyBatis+SpringMvc整合Demo
客户关系管理系统demo 项目分析 该demo使用技术及环境:ssm+maven+bootstrap+jsp+mysql+idea+jdk1.8 需求:客户管理,实现客户列表分页显示如下图 项目开始 ...
- SSM整合(1): spring 与 springmvc 整合
久没有写博客了, 今年事情太多了, 也没了心思. 去深圳出差, 更重要的结婚的事情, 一茬接一茬. 好在最近闲暇一些, 就想记录一些曾经困扰过我的问题(现在用spring boot真是太方便了, 很 ...
- spring和springmvc父子容器关系
一般来说,我们在整合spring和SpringMVC这两个框架中,web.xml会这样写到: <!-- 加载spring容器 --> <!-- 初始化加载application.xm ...
- spring盒springMVC整合父子容器问题:整合Spring时Service层为什么不做全局包扫描详解
整合Spring时Service层为什么不做全局包扫描详解 一.Spring和SpringMVC的父子容器关系 1.讲问题之前要先明白一个关系 一般来说,我们在整合Spring和SpringMVC这两 ...
- Spring和SpringMVC父子容器关系初窥
一.背景 最近由于项目的包扫描出现了问题,在解决问题的过程中,偶然发现了Spring和SpringMVC是有父子容器关系的,而且正是因为这个才往往会出现包扫描的问题,我们在此来分析和理解Spring和 ...
- Spring与SpringMVC的容器关系分析
Spring和SpringMVC作为Bean管理容器和MVC层的默认框架,已被众多WEB应用采用,而实际使用时,由于有了强大的注解功能,很多基于XML的配置方式已经被替代,但是在实际项目中,同时配置S ...
- spring mybatis springmvc整合
使用SSM(Spring.SpringMVC和Mybatis)已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地方.之前没有记录SSM整合 ...
- Spring 与 SpringMVC 容器父子关系引出的相应问题
1)关系说明 spring 与 springmvc 父子关系:spring (父容器),springmvc (子容器) springmvc(子)--- 可调用 --> spring(父) 中的 ...
- Spring、Springmvc整合web的web.xml配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http:// ...
随机推荐
- JS获取Cookie失败
项目开发日记-bug多多篇(1) 在做评论功能的时候遇到了一个很无厘头的错误,我的思路是参照点赞功能,用Ajax技术异步完成评论信息的传输,然后展示在页面上. 那么在提交评论信息的同时,要连着用户名, ...
- MyBatis插件 - 通用mapper
1.简单认识通用mapper 1.1.了解mapper 作用:就是为了帮助我们自动的生成sql语句 [ ps:MyBatis需要编写xxxMapper.xml,而逆向工程是根据entity实体类来进行 ...
- Bugku CTF练习题---MISC---这是一张单纯的图片
Bugku CTF练习题---MISC---这是一张单纯的图片 flag:key{you are right} 解题步骤: 1.观察题目,下载附件 2.打开以后发现是一张图片,修改文件扩展名,查看属性 ...
- 数据交换格式 JSON
1. 什么是 JSON 概念 : JSON 的英文全称是 JavaScript ObjEct Notation, 即 "JavaScript 对象表示法" . 简单来讲 : JSO ...
- 一文彻底搞懂MySQL分区
一个执着于技术的公众号 一.InnoDB逻辑存储结构 首先要先介绍一下InnoDB逻辑存储结构和区的概念,它的所有数据都被逻辑地存放在表空间,表空间又由段,区,页组成. 段 段就是上图的segment ...
- 干货 | 手把手教你搭建一套OpenStack云平台
1 前言 今天我们为一位朋友搭建一套OpenStack云平台. 我们使用Kolla部署stein版本的OpenStack云平台. kolla是用于自动化部署OpenStack的一个项目,它基于dock ...
- RabbitMQ 3.9( 基础 )
1.认识MQ 1.1.什么是MQ? MQ全称:message queue 即 消息队列 这个队列遵循的原则:FIFO 即 先进先出 队列里面存的就是message 1.2.为什么要用MQ? 1.2.1 ...
- 推荐一款数据mock框架,无需任何依赖,贼牛逼
fox-mock 是基于Java Agent实现的自测,联调Mock利器.能解决你的这些问题: 开发过程中,依赖了下游多个接口,想跑个单测都必须得等下游把服务部署好 联调过程中,下游某个接口出问题,阻 ...
- wait、notify和notifyAll方法学习
wait.notify和notifyAll方法 wait() 方法会使该锁资源释放,然后线程进入等待WAITING状态,进入锁的waitset中,然后等待其他线程对锁资源调用notify方法或noti ...
- C# WPF后台动态添加控件(经典)
概述 在Winform中从后台添加控件相对比较容易,但是在WPF中,我们知道界面是通过XAML编写的,如何把后台写好的控件动态添加到前台呢?本节举例介绍这个问题. 这里要用到UniformGrid布局 ...