深入理解MyBatis-Spring中介軟體
- 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) +
- } else {
- processBeanDefinitions(beanDefinitions);
- }
- return beanDefinitions;
- }
- privatevoid 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;
- } elseif (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;
- } elseif (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);
- }
- }
- }
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框架的數據源結構進行