SSM框架註解整合

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的應用上下文,RootContextContextLoaderListener建立,其中存放了各類註冊到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:本文不按期更新,有錯誤的地方歡迎評論告訴我,謝謝。

相關文章
相關標籤/搜索