一、web应用环境

  1.ServletContext

   对于一个web应用,其部署在web容器(比如:tomcat)中,web容器提供其一个全局的上下文环境,这个上下文就是ServletContext,它由web容器负责初始化,其为后面的spring容器提供宿主环境。

 ServletContext是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释放。ServletContext提供对应用程序中所有Servlet所共有的各种资源和功能的访问。Servlet上下文API用于设置应用程序中所有Servlet共有的信息,Servlet可能需要共享他们之间的共有信息。运行于同一服务器的Servlet有时会共享资源,如JSP页面、文件和其它Servlet。request,一个用户可有多个;session,一个用户一个;而servletContext在整个web应用中只有一个,所有用户也只共用一个。所以,为了节省空间,提高效率,ServletContext中,要放必须的、重要的、所有用户需要共享的线程又是安全的一些信息。

 换一种方式说吧,运行在Java虚拟机中的每一个Web应用程序都有一个与之相关的Servlet上下文。ServletContext对象是Web服务器中的一个已知路径的根,Servlet上下文被定位于http://localhost:8080/项目名. 以 /项目名 请求路径(称为上下文路径)开始的所有请求被发送到与此ServletContext关联的Web应用程序。一个ServletContext对象表示了一个Web应用程序的上下文。

 举例:做一个购物类的网站,要从数据库中提取物品信息,如果用session保存这些物品信息,每个用户都访问一便数据库,效率就太低了;所以要用来Servlet上下文来保存,在服务器开始时,就访问数据库,将物品信息存入Servlet上下文中,这样,每个用户只用从上下文中读入物品信息就行了。

2. RootWebApplicationContext和DispatcherServletWebApplicationContext

   以下简称RootWebApplicationContext为:RootContext,DispatcherServletWebApplicationContext为:DispatcherServletContext。

 WebApplicationContext扩展了ApplicationContext,代表的Spring Web的应用上下文,RootContext由ContextLoaderListener创建,其中存放了各种注册到Spring的非Web组件的bean(比如service)。RootContext初始化完成后将其存储到ServletContext中,便于获取。在源码中你可以看到这样的代码:servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);//this.context就是RootContext

接着是DispatcherServletContext的初始化,它会以RootContext为父上下文(在DispatcherServletContext中可以引用RootContext中的非web组件,而反过来不行。),然后初始化Web相关组件,比如控制器,视图解析器等。DispatcherServletContext初始化完毕后将自身存入ServletContext.

相关源码:在初始化DispatherServlet中,org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext()

WebApplicationContext rootContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());//获取RootContext(非web组件,比如service)
WebApplicationContext dispatcherServletContext = this.webApplicationContext;
dispatcherServletContext.setParent(rootContext);//以RootContext为父上下文
getServletContext().setAttribute(attrName, dispatcherServletContext);//将dispatcherServletContext存入ServletContext

继承结构图:

log4j日志轨迹:

  3. WebApplicationContext和DispatcherServlet上下文初始化方式

     初始化方式有两种:Java配置和在web.xml配置,不管是哪种配置方式,所做的工作差别不大。

     java配置:在servlet 3.0环境中,web容器会在类路径中查找实现了javax.servlet.ServletContainerInitializer接口的类,如果能找到此类就会用它来配置Servlet容器。Spring提供了这个接口的实现,名为SpringServletContainerInitializer,这个实现又查找实现了WebApplicationInitializer接口的类。Spring 3.2引入了一个WebApplicationInitializer的一个便利的基础实现类:AbstractAnnotationConfigDispatcherServletInitializer。它会创建DispatcherServleContext和RootContext,现在只需扩展它即可。

  (1) SsmContextInitializer.java

  

  (2) RootConfig.java

  

  (3) WebConfig.java

   

  来看看DispatcherServletContext和它的父上下文RootContext存储的核心Bean:

  1.DispatcherServletContext:

  

  从图中可以看出:DispatcherServletContext中存储的Bean是与web相关的组件,比如视图解析器,处理器映射等。

  2.RootContext(在DispatcherServletContext可以看到它的父上下文Root):

  

  从图中可以看出:RootContext中存储的Bean是非web组件,比如Service。

二、Mybatis

  1.在独立的Mybatis中的核心组件:

    .SqlSessionFactory:生成SqlSession(会话),由SqlSessionFactoryBuilder根据配置信息创建。

    2.SqlSession:一个既可以发送SQL去执行并返回结果,也可以获取Mapper的接口。

    3.SQL Mapper:由mapper配置文件(也可以是注解配置)和java接口构成,根据给出的mapper配置文件来发送SQL去执行并返回结构

    核心编程代码:

     (1). MybatisConfig.xml

    

   (2) UserMapper.xml

   

   (3) Demo.java

   2.在MyBatis-Spring中的核心组件:

  为了代替手工使用 SqlSessionDaoSupport 或 SqlSessionTemplate 编写数据访问对象 (DAO)的代码,MyBatis-Spring 提供了一个动态代理的实现:MapperFactoryBean。这个类 可以让你直接注入数据映射器接口到你的 service 层 bean 中。当使用映射器时,你仅仅如调 用你的 DAO 一样调用它们就可以了,但是你不需要编写任何 DAO 实现的代码,因为 MyBatis-Spring 将会为你创建代理。MapperFactoryBean 创建的代理类实现了 UserMapper 接口,并且注入到应用程序中。 因为代理创建在运行时环境中,那么指定的映射器必须是一个接口,而 不是一个具体的实现类。

注意:如果 UserMapper 有一个对应的 MyBatis 的 XML 映射器文件, 如果 XML 文件在类路径的 位置和映射器类相同时, 没有必要在去指定映射器,它会被 MapperFactoryBean 自动解析,反之亦然。我们一般会将Mapper接口的类完全限定名和Mapper.xml配置文件的命名空间写成一致。

  核心bean的创建:配置在非web组件(上文的RootConfig.java)中

  1.javax.sql.DataSource:创建它的实现类即可,比如org.apache.ibatis.datasource.pooled.PooledDataSource;

   解释:配置url,driver,userName,password;

   
  2.org.mybatis.spring.SqlSessionFactoryBean

   解释:配置SqlSessionFactory,主要提供数据源和mapper配置文件

   

  3.org.mybatis.spring.mapper.MapperFactoryBean

  解释:为对应的Mapper接口创建代理

  

  注意:在实际应用中肯定会有多个Dao,一个个去配置过于繁琐,所以我们一般采用MapperScannerConfigurer,它将会查找指定类路径下的映射器并自动将它们创建成MapperFactoryBean。

    3.org.mybatis.spring.mapper.MapperScannerConfigurer

   解释:配置mapper接口的扫描器,提供mapper接口所在的包名(必须的)

   

     MapperScannerConfigurer中还有几个常用到的属性配置:

    1.private Class<? extends Annotation> annotationClass:指定包中的接口若有指定的注解则扫描(认为它是Mapper)

    例子:scannerConfigurer.setAnnotationClass(Repository.class);//若有此配置,Mapper扫描器会只扫描带有@Repository注解的接口

    2.private Class<?markerInterface:指定包中的接口若实现了指定的接口则扫描(认为它是Mapper)

     例子:scannerConfigurer.setmarkerInterface(IUserDao.class);//若有此配置,Mapper扫描器会只扫描带有实现了IUserDao的接口

     3个组件配置完毕后,你只需要直接注入数据映射器接口到你的 service 层 bean 中。直接调用数据映射器接口的方法即可:

   service层代码:IUserDao接口没有任何手动实现类,其实现由MapperFactoryBean创建并注入到程序中。

    

       最后在web组件中创建Controller即可运行。

    PS:本文不定期更新,有错误的地方欢迎评论告诉我,谢谢。

SSM框架注解整合的更多相关文章

  1. SSM 框架快速整合实例--学生查询

    一.快速准备 SSM 框架即 Spring 框架.SpringMVC 框架.MyBatis 框架,关于这几个框架的基础和入门程序,我前面已经写过几篇文章作为基础和入门介绍了.对于这 3 个框架还不熟悉 ...

  2. SSM框架快速整合实例——学生查询

    一.快速准备 SSM 框架即 Spring 框架.SpringMVC 框架.MyBatis 框架,关于这几个框架的基础和入门程序,我前面已经写过几篇文章作为基础和入门介绍了.这里再简单的介绍一下: 1 ...

  3. SSM框架——详细整合教程

    SSM框架——详细整合教程(Spring+SpringMVC+MyBatis) 1.基本概念   1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Jav ...

  4. SSM框架的整合与使用——实现简单的转账系统

    一.整合思路 SSM框架即SpringMVC + Spring + MyBati框架集,是一种轻量级的Web开源框架.它们各自在JAVA三层架构中负责的模块如下图所示: 其中,SpringMVC与Sp ...

  5. SSM框架的整合思路&功能实现

    这是我第一篇博客,关于SSM框架的整合思路以及简单功能实现. 首先,最近刚刚学习Spring+SpringMVC+Mybatis,在开发时遇到形形色色的问题,周遭人也为我提供了一些思路,我会一点点整理 ...

  6. SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)【申明:来源于网络】

    SSM框架--详细整合教程(Spring+SpringMVC+MyBatis)[申明:来源于网络] 地址:http://blog.csdn.net/u014662268/article/details ...

  7. SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

    1.前言 使用框架都是较新的版本: Spring 4.0.2 RELEASE Spring MVC 4.0.2 RELEASE MyBatis 3.2.6 2.Maven引入需要的JAR包 2.1设置 ...

  8. [转]SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

    原文地址:http://blog.csdn.net/zhshulin/article/details/37956105#comments 使用SSM(Spring.SpringMVC和Mybatis) ...

  9. SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)【转载】

    最近在学习Spring+SpringMVC+MyBatis的整合.以下是参考网上的资料自己实践操作的详细步骤. 1.基本概念   1.1.Spring Spring是一个开源框架,Spring是于20 ...

随机推荐

  1. css3盒模型学习--利用box自适应布局

    box-flex是css3新添加的盒子模型属性,它的出现可以解决我们通过N多结构.css实现的布局方式.经典   的一个布局应用就是布局的垂直等高.水平均分.按比例划分. 目前box-flex属性还没 ...

  2. Apriori算法第二篇----详细分析和代码实现

    1 Apriori介绍 Apriori算法使用频繁项集的先验知识,使用一种称作逐层搜索的迭代方法,k项集用于探索(k+1)项集.首先,通过扫描事务(交易)记录,找出所有的频繁1项集,该集合记做L1,然 ...

  3. js 日期控件laydate使用

    官网  http://sentsin.com/layui/laydate/ 1. 下载官网上的压缩包,解压后只需要复制laydate 文件夹到你的项目中; 2. 在页面引入  <script t ...

  4. Mysql 常用引擎的特点及选择使用策略

    Mysql 常用引擎的特点及选择使用策略 Mysql数据库常用存储引擎 Mysql数据库是一款开源的数据库,支持多种存储引擎的选择,比如目前最常用的存储引擎有:MyISAM,InnoDB,Memory ...

  5. truetype技术和矢量字库的技术原理及实现(转)

    源:truetype技术和矢量字库的技术原理及实现 广泛汉字矢量字库(HZKSLxxJ)格式             在矢量字库中,每个汉字都是以128   X   128点阵制成矢量数据.每个汉字  ...

  6. 网络IO模型

    同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出 ...

  7. LPC1768的iic通讯

    LPC1768有三路IIC,其中IIC0支持高速模式和plus模式,另外两路是普通IIC,使用IIC的过程如下 首先依然是打开IIC时钟,同时打开GPIO时钟 然后配置引脚为IIC功能 另外,因为ii ...

  8. 将ADS1.2的工程迁移到KEIL上-基于2440

    裸机程序应该是一个很好的选择 1. 不拷贝启动代码,因为我们用自己的启动代码 2.       建立工程目录分级,建立完成后如下所示 拷贝相应代码到对应目录中 Option中拷贝 Core中拷贝 建立 ...

  9. SD卡初始化以及命令详解

    SD卡是嵌入式设备中很常用的一种存储设备,体积小,容量大,通讯简单,电路简单所以受到很多设备厂商的欢迎,主要用来记录设备运行过程中的各种信息,以及程序的各种配置信息,很是方便,有这样几点是需要知道的 ...

  10. ARM交叉编译工具链分类说明

    转载整理自:http://www.veryarm.com/cross-tools 从授权上,ARM交叉编译工具链分为免费授权版和付费授权版. 免费版目前有三大主流工具商提供,第一是GNU(提供源码,自 ...