1. 程式人生 > >深入理解MyBatis-Spring中介軟體

深入理解MyBatis-Spring中介軟體

[java] view plain copy print?
  1. public Set<BeanDefinitionHolder> doScan(String… basePackages) {  
  2.     Set<BeanDefinitionHolder> beanDefinitions = super.doScan(basePackages);  
  3.     if (beanDefinitions.isEmpty()) {  
  4.       logger.warn(”No MyBatis mapper was found in ’” + Arrays.toString(basePackages) + 
    “’ package. Please check your configuration.”);  
  5.     } else {  
  6.       processBeanDefinitions(beanDefinitions);  
  7.     }  
  8.     return beanDefinitions;  
  9.   }  
  10.   privatevoid processBeanDefinitions(Set<BeanDefinitionHolder> beanDefinitions) {  
  11.     GenericBeanDefinition definition;  
  12.     for (BeanDefinitionHolder holder : beanDefinitions) {  
  13.       definition = (GenericBeanDefinition) holder.getBeanDefinition();  
  14.       if (logger.isDebugEnabled()) {  
  15.         logger.debug(”Creating MapperFactoryBean with name ’” + holder.getBeanName()   
  16.           + ”’ and ’” + definition.getBeanClassName() + “’ mapperInterface”);  
  17.       }  
  18.       // the mapper interface is the original class of the bean
  19.       // but, the actual class of the bean is MapperFactoryBean
  20.       definition.getConstructorArgumentValues().addGenericArgumentValue(definition.getBeanClassName()); // issue #59
  21.       definition.setBeanClass(this.mapperFactoryBean.getClass());//將其bean Class型別設定為mapperFactoryBean,放入BeanDefinitions
  22.       definition.getPropertyValues().add(”addToConfig”this.addToConfig);  
  23.       boolean explicitFactoryUsed = false;  
  24.       if (StringUtils.hasText(this.sqlSessionFactoryBeanName)) {  
  25.         definition.getPropertyValues().add(”sqlSessionFactory”new RuntimeBeanReference(this.sqlSessionFactoryBeanName));  
  26.         explicitFactoryUsed = true;  
  27.       } elseif (this.sqlSessionFactory != null) {  
  28.         definition.getPropertyValues().add(”sqlSessionFactory”this.sqlSessionFactory);  
  29.         explicitFactoryUsed = true;  
  30.       }  
  31.       if (StringUtils.hasText(this.sqlSessionTemplateBeanName)) {  
  32.         if (explicitFactoryUsed) {  
  33.           logger.warn(”Cannot use both: sqlSessionTemplate and sqlSessionFactory together. sqlSessionFactory is ignored.”);  
  34.         }  
  35.         definition.getPropertyValues().add(”sqlSessionTemplate”new RuntimeBeanReference(this.sqlSessionTemplateBeanName));  
  36.         explicitFactoryUsed = true;  
  37.       } elseif (this.sqlSessionTemplate != null) {  
  38.         if (explicitFactoryUsed) {  
  39.           logger.warn(”Cannot use both: sqlSessionTemplate and sqlSessionFactory together. sqlSessionFactory is ignored.”);  
  40.         }  
  41.         definition.getPropertyValues().add(”sqlSessionTemplate”this.sqlSessionTemplate);  
  42.         explicitFactoryUsed = true;  
  43.       }  
  44.       if (!explicitFactoryUsed) {  
  45.         if (logger.isDebugEnabled()) {  
  46.           logger.debug(”Enabling autowire by type for MapperFactoryBean with name ’” + holder.getBeanName() + “’.”);  
  47.         }  
  48.         definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);  
  49.       }  
  50.     }  
  51.   }  
public Set<BeanDefinitionHolder> doScan(String... basePackages) {
    Set<BeanDefinitionHolder> beanDefinitions = super.doScan(basePackages);

    if (beanDefinitions.isEmpty()) {
      logger.warn("No MyBatis mapper was found in '" + Arrays.toString(basePackages) + "' package. Please check your configuration.");
    } else {
      processBeanDefinitions(beanDefinitions);
    }

    return beanDefinitions;
  }

  private void processBeanDefinitions(Set<BeanDefinitionHolder> beanDefinitions) {
    GenericBeanDefinition definition;
    for (BeanDefinitionHolder holder : beanDefinitions) {
      definition = (GenericBeanDefinition) holder.getBeanDefinition();

      if (logger.isDebugEnabled()) {
        logger.debug("Creating MapperFactoryBean with name '" + holder.getBeanName() 
          + "' and '" + definition.getBeanClassName() + "' mapperInterface");
      }

      // the mapper interface is the original class of the bean
      // but, the actual class of the bean is MapperFactoryBean
      definition.getConstructorArgumentValues().addGenericArgumentValue(definition.getBeanClassName()); // issue #59
      definition.setBeanClass(this.mapperFactoryBean.getClass());//將其bean Class型別設定為mapperFactoryBean,放入BeanDefinitions

      definition.getPropertyValues().add("addToConfig", this.addToConfig);

      boolean explicitFactoryUsed = false;
      if (StringUtils.hasText(this.sqlSessionFactoryBeanName)) {
        definition.getPropertyValues().add("sqlSessionFactory", new RuntimeBeanReference(this.sqlSessionFactoryBeanName));
        explicitFactoryUsed = true;
      } else if (this.sqlSessionFactory != null) {
        definition.getPropertyValues().add("sqlSessionFactory", this.sqlSessionFactory);
        explicitFactoryUsed = true;
      }

      if (StringUtils.hasText(this.sqlSessionTemplateBeanName)) {
        if (explicitFactoryUsed) {
          logger.warn("Cannot use both: sqlSessionTemplate and sqlSessionFactory together. sqlSessionFactory is ignored.");
        }
        definition.getPropertyValues().add("sqlSessionTemplate", new RuntimeBeanReference(this.sqlSessionTemplateBeanName));
        explicitFactoryUsed = true;
      } else if (this.sqlSessionTemplate != null) {
        if (explicitFactoryUsed) {
          logger.warn("Cannot use both: sqlSessionTemplate and sqlSessionFactory together. sqlSessionFactory is ignored.");
        }
        definition.getPropertyValues().add("sqlSessionTemplate", this.sqlSessionTemplate);
        explicitFactoryUsed = true;
      }

      if (!explicitFactoryUsed) {
        if (logger.isDebugEnabled()) {
          logger.debug("Enabling autowire by type for MapperFactoryBean with name '" + holder.getBeanName() + "'.");
        }
        definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);
      }
    }
  }
那MapperFactoryBean究竟又做了什麼呢,看原始碼,

相關推薦

深入理解MyBatis-Spring中介軟體

[java] view plain copy print?public Set<BeanDefinitionHolder> doScan(String… basePackages) {      Set<BeanDefinitionHolder> beanDefinitions = s

深入理解 Koa 框架中介軟體原理

Node 主要用在開發 Web 應用,koa 是目前 node 裡最流行的 web 框架。 在 Node 開啟一個 http 服務簡直易如反掌,官網 demo。 const http = require("http"); const server = http.createServer(

深入理解MyBatis的原理(三):配置文件上

dynamic 如何 turn ready conf 屬性。 支持 left bool 前言:前文提到一個入門的demo,從這裏開始,會了解深入 MyBatis 的配置,本文講解 MyBatis 的配置文件的用法。 目錄 1、properties 元素 2、設置(set

深入理解MyBatis的原理(三):配置文件用法(續)

pac amt 單個 gis obb rri tab obj 用戶 前言:前文講解了 MyBatis 的配置文件一部分用法,本文將繼續講解 MyBatis 的配置文件的用法。 目錄 1、typeHandler 類型處理器 2、ObjectFactory 3、插件 4、e

理解 Koa 框架中介軟體原理

原文連結 Node 主要用在開發 Web 應用,koa 是目前 node 裡最流行的 web 框架。 在 Node 開啟一個 http 服務簡直易如反掌,官網 demo。 const http = require("http"); const server = http.createServ

深入理解mybatis原理》 MyBatis快取機制的設計與實現

本文主要講解MyBatis非常棒的快取機制的設計原理,給讀者們介紹一下MyBatis的快取機制的輪廓,然後會分別針對快取機制中的方方面面展開討論。 MyBatis將資料快取設計成兩級結構,分為一級快取、二級快取:       &nb

深入理解mybatis原理》 MyBatis的二級快取的設計原理

       MyBatis的二級快取是Application級別的快取,它可以提高對資料庫查詢的效率,以提高應用的效能。本文將全面分析MyBatis的二級快取的設計原理。 1.MyBatis的快取機制整體設計以及二級快取的工作模式  

深入理解mybatis原理(三)》 MyBatis的一級快取實現詳解 及使用注意事項

0.寫在前面         MyBatis是一個簡單,小巧但功能非常強大的ORM開源框架,它的功能強大也體現在它的快取機制上。MyBatis提供了一級快取、二級快取 這兩個快取機制,能夠很好地處理和維護快取,以提高系統的效能。本文的目的則是向讀者詳細介紹MyBatis的一級快取,深入原始碼,解析MyBa

理解 Koa 框架中介軟體原理-看懂了compose方法,也就看懂了 Koa

Node 主要用在開發 Web 應用,koa 是目前 node 裡最流行的 web 框架。 一個簡單的 http 服務 在 Node 開啟一個 http 服務簡直易如反掌,下面是官網 demo。 const http = require("http"); const serve

深入理解mybatis原理》 Mybatis初始化機制詳解 侵立刪

對於任何框架而言,在使用前都要進行一系列的初始化,MyBatis也不例外。本章將通過以下幾點詳細介紹MyBatis的初始化過程。   1.MyBatis的初始化做了什麼   2. MyBatis基於XML配置檔案建立Configuration物件的過程 &nb

深入理解mybatis原理(十二)》 mybatis深入理解之#與$區別

一、介紹 mybatis 中使用 Mapper.xml裡面的配置進行 sql 查詢,經常需要動態傳遞引數,例如我們需要根據使用者的姓名來篩選使用者時,sql 如下: select * from user where name = "Jack";上述 sql 中,我們希

深入理解mybatis原理》 Mybatis資料來源與連線池

    對於ORM框架而言,資料來源的組織是一個非常重要的一部分,這直接影響到框架的效能問題。本文將通過對MyBatis框架的資料來源結構進行詳盡的分析,並且深入解析MyBatis的連線池。     本文首先會講述MyBatis的資料來源的分類,然後會介紹資料來源是如何載入

深入理解mybatis

Mybatis元件時序圖 SqlSessionFactoryBuilder類通過讀取Configuration.xml檔案的配置呼叫build()方法生成SqlSessionFactory物件。集成了spring的話,spring容器在啟動的時候會就會載入好Sql

深入理解mybatis原理(七)》 MyBatis的架構設計以及例項分析

        MyBatis是目前非常流行的ORM框架,它的功能很強大,然而其實現卻比較簡單、優雅。本文主要講述MyBatis的架構設計思路,並且討論MyBatis的幾個核心部件,然後結合一個select查詢例項,深入程式碼,來探究MyBatis的實現。 一、MyBatis的框架設計   

深入理解mybatis原理

public <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQ

深入理解mybatis原理》 MyBatis的架構設計以及例項分析

public <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQ

深入理解mybatis原理7》 MyBatis的二級緩存的設計原理

data 是否 cat sch 定義 劃分 sel 博文 算法 《深入理解mybatis原理》 MyBatis的二級緩存的設計原理 MyBatis的二級緩存是Application級別的緩存,它可以提高對數據庫查詢的效率,以提高應用的性能。本文將全面分析MyBatis的二級

深入理解mybatis原理4》 MyBatis緩存機制的設計與實現

針對 ces 機制 實現 ssi 查看 緩存機制 內存 完成 《深入理解mybatis原理》 MyBatis緩存機制的設計與實現 本文主要講解MyBatis非常棒的緩存機制的設計原理,給讀者們介紹一下MyBatis的緩存機制的輪廓,然後會分別針對緩存機制中的方方面面展開討論

深入理解mybatis原理1》 MyBatis的架構設計以及實例分析

etx parent type start clean odin del 個數 eth 《深入理解mybatis原理》 MyBatis的架構設計以及實例分析 MyBatis是目前非常流行的ORM框架,它的功能很強大,然而其實現卻比較簡單、優雅。本文主要講述MyBatis

深入理解mybatis原理3》 Mybatis數據源與連接池

Opens red and 分享 使用 wait dstat void var 《深入理解mybatis原理》 Mybatis數據源與連接池 對於ORM框架而言,數據源的組織是一個非常重要的一部分,這直接影響到框架的性能問題。本文將通過對MyBatis框架的數據源結構進行