1、web应用环境java
1.ServletContextweb
对于一个web应用,其部署在web容器(好比:tomcat)中,web容器提供其一个全局的上下文环境,这个上下文就是ServletContext,它由web容器负责初始化,其为后面的spring容器提供宿主环境。spring
ServletContext是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释放。ServletContext提供对应用程序中全部Servlet所共有的各类资源和功能的访问。Servlet上下文API用于设置应用程序中全部Servlet共有的信息,Servlet可能须要共享他们之间的共有信息。运行于同一服务器的Servlet有时会共享资源,如JSP页面、文件和其它Servlet。request,一个用户可有多个;session,一个用户一个;而servletContext在整个web应用中只有一个,全部用户也只共用一个。因此,为了节省空间,提升效率,ServletContext中,要放必须的、重要的、全部用户须要共享的线程又是安全的一些信息。sql
换一种方式说吧,运行在Java虚拟机中的每个Web应用程序都有一个与之相关的Servlet上下文。ServletContext对象是Web服务器中的一个已知路径的根,Servlet上下文被定位于http://localhost:8080/项目名. 以 /项目名 请求路径(称为上下文路径)开始的全部请求被发送到与此ServletContext关联的Web应用程序。一个ServletContext对象表示了一个Web应用程序的上下文。数据库
举例:作一个购物类的网站,要从数据库中提取物品信息,若是用session保存这些物品信息,每一个用户都访问一便数据库,效率就过低了;因此要用来Servlet上下文来保存,在服务器开始时,就访问数据库,将物品信息存入Servlet上下文中,这样,每一个用户只用从上下文中读入物品信息就好了。apache
2. RootWebApplicationContext和DispatcherServletWebApplicationContext编程
如下简称RootWebApplicationContext为:RootContext,DispatcherServletWebApplicationContext为:DispatcherServletContext。
tomcat
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。
2、Mybatis
1.在独立的Mybatis中的核心组件:
1.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:本文不按期更新,有错误的地方欢迎评论告诉我,谢谢。