一、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:本文不定期更新,有错误的地方欢迎评论告诉我,谢谢。

最新文章

  1. USB OTG插入检测识别
  2. 自定义view文字垂直居中
  3. Asp.Net远程调试
  4. maven初学(二)archeType插件使用
  5. RAC 数据库的启动与关闭
  6. C# 创建新RTF文件
  7. javax.Swing 使用GridBagLayout的程序栗子
  8. CentOS yum安装配置lnmp服务器(Nginx+PHP+MySQL)
  9. IE6下绝对定位元素父级宽高是奇数,绝对定位元素的right和bottom值会有1个像素的偏差
  10. request.getParameter()与request.setAttribute()的区别 (转载)
  11. 浅析调用JSR303的validate方法, 验证失败时抛出ConstraintViolationException
  12. ABAP更换请求
  13. .NET Core 跨平台发布Linux和OSX
  14. VS中Debug与Release、_WIN32与_WIN64的区别
  15. 如何在 Linux 中查找最大的 10 个文件
  16. 使用Logstash filter grok过滤日志文件
  17. left outer join的on不起作用
  18. 【Hbase学习之一】Hbase 简介
  19. Common lang一些边界方法总结(好记性不如烂笔头,需要慢慢积累).一定要利用好现有的轮子,例如Apache common与Google Guava
  20. Windows下创建文件的权限问题

热门文章

  1. PAT (Advanced Level) 1010. Radix (25)
  2. 计算机学院大学生程序设计竞赛(2015’12) 1003 The collector’s puzzle
  3. java如何计算程序运行时间
  4. CodeForces 617C Watering Flowers
  5. 如何在微软Hyper-V下发挥SQL Server最大功效
  6. [转]SQL Server&#174; 2008 R2 Express 静默安装
  7. RecyclerView学习笔记
  8. Codeforces #317 C.Lengthening Sticks(数学)
  9. C# .NET修改注册表
  10. oracle关键字(保留字)