mybatis plus原始碼解析(一) ---基於springboot配置載入和SqlSessionFactory的構造

xjz1842發表於2018-05-04

一直想分析下框架的程式碼,之前也看過Spring等框架原始碼,但是看了似懂非懂的,這次要將分析的記錄下,如果發現不理解可以再來重新看下這個記錄,還是從簡單mybatis-plus來分析下,為什麼mybatis-plus?最近專案在使用這個。mybatis-plus在mybatis上做了一層擴充套件,詳細瞭解請訪問官網地址:mybatis-plus 專案依賴工具是maven, 引入的專案依賴如下:

 <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus</artifactId>
        <version>2.1.9</version>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatisplus-spring-boot-starter</artifactId>
        <version>1.0.5</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>6.0.6</version>
    </dependency>
接下看一下spring boot載入的mybatis-plus的配置和
複製程式碼

mybatis plus原始碼解析(一) ---基於springboot配置載入和SqlSessionFactory的構造
上圖可以看出mybatisplus-spring-boot-starter這個依賴中spring.factories檔案中,spring boot的EnableAutoConfiguration載入的MybatisPlusAutoConfiguration這個類,如果不熟悉spring boot starter的使用的可以參考的這裡 接下來可以看下MybatisPlusAutoConfiguration裡是如果初始化配置的。

mybatis plus原始碼解析(一) ---基於springboot配置載入和SqlSessionFactory的構造
從註解的角度看

  • @Configuration是將該類加入spring容器當中,
  • @ConditionalOnClass({SqlSessionFactory.class, MybatisSqlSessionFactoryBean.class})
  • SqlSessionFactory,MybatisSqlSessionFactoryBean類的的依賴存在。
  • @ConditionalOnBean(DataSource.class) DataSource這個例項必須存在
  • @EnableConfigurationProperties(MybatisPlusProperties.class) 載入配置到MybatisPlusProperties這個類中
  • @AutoConfigureAfter(DataSourceAutoConfiguration.class) 其他的類載入完之後,再載入DataSourceAutoConfiguration這個類,它主要是完成資料配置初始化。 接下來,看一下 SqlSessionFactory的構造,
    mybatis plus原始碼解析(一) ---基於springboot配置載入和SqlSessionFactory的構造

@ConditionalOnMissingBean是在Spring容器中缺少bean的時候,建立SqlSessionFactory這個物件,前面已經建立了DataSource這個物件,這個例項在 這個方法中會自動注入進來,這是Spring的IOC來完成的, 這個類中,會建立一個MybatisSqlSessionFactoryBean的例項,它是實現Spring中FactoryBean介面的類,然後在這個例項中設定DataSource,VFS,ConfigLocation,MybatisConfiguraition(它是繼承與Mybatis的Configuration)等屬性

mybatis plus原始碼解析(一) ---基於springboot配置載入和SqlSessionFactory的構造
SqlSessionFactory的建立的下半部分,可以看出,都是給MybatisSqlSessionFactoryBean設定各種屬性,最後一句是最重要的是,呼叫MybatisSqlSessionFactoryBean的getObject()的方法.

mybatis plus原始碼解析(一) ---基於springboot配置載入和SqlSessionFactory的構造
可以看到getObject獲取SqlSessionFacoty,會呼叫afterPropertiesSet()

mybatis plus原始碼解析(一) ---基於springboot配置載入和SqlSessionFactory的構造

afterPropertiesSet緊接著會呼叫 buildSqlSessionFactory()方法
mybatis plus原始碼解析(一) ---基於springboot配置載入和SqlSessionFactory的構造
。 可以從圖上看出,如果是在configLocation的路徑存在,則載入自定義的batisConfigBuilder物件,採用springboot的配置載入,所以這裡configcation不存在的,所以只會走第一個分支,將配置屬性都設定到configurion這個物件中。

mybatis plus原始碼解析(一) ---基於springboot配置載入和SqlSessionFactory的構造
那麼接下來的一段程式碼就是為掃描配置的實體的路徑,以及註冊別名了,
mybatis plus原始碼解析(一) ---基於springboot配置載入和SqlSessionFactory的構造
這注意一下,如果mybatis中想為實體定義別名,則可以在實體上加上@Alias("xx")註解來標註,如果不加,則預設是英文全小寫來標識別名。

mybatis plus原始碼解析(一) ---基於springboot配置載入和SqlSessionFactory的構造
接下來就是註冊外掛和型別轉化處理了。

mybatis plus原始碼解析(一) ---基於springboot配置載入和SqlSessionFactory的構造
接下來是設定事務管理器,這裡可以看到預設是用SpringManageTransactionFactory,然後設定全域性配置,以及利SqlSessionFactoryBuilder傳入configuration建立一個DefaultSqlSessionFactory物件,它建立的DefaultSqlSession再注入到SqlSessionTemplate物件中,SqlSessionTemplate才是真正與資料庫互動的類,

mybatis plus原始碼解析(一) ---基於springboot配置載入和SqlSessionFactory的構造
接下最重要的是掃描載入mapper對映的xml,解析的工作是由XMLMapperBuilder的parse()方法完成的.具體即系,大家感興趣可以自己去看下。不過回去介紹它是怎麼使用註解寫sql的,畢竟現在註解比較流行點吧,但是在憑藉sql方面還是要弱於xml的,

mybatis plus原始碼解析(一) ---基於springboot配置載入和SqlSessionFactory的構造
到了這裡,似乎忘了,mapper的掃描和註冊到configuration的過程,由於建立SqlSessionFactory的過程太長,所以還是留在下一篇介紹吧。

總結: 今天主要介紹了基於springboot載入mybatis-plus的配置和SqlsessionFactory的構造,初次寫原始碼級別的分析,寫得不好,如果發現理解上的錯誤,希望大家多指教,謝謝!

相關文章