中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mybatis集成到spring的方式有哪些

發布時間:2023-07-04 09:10:29 來源:億速云 閱讀:131 作者:栢白 欄目:開發技術

本篇文章和大家了解一下mybatis集成到spring的方式有哪些。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。

1 前言

1.1 集成spring前使用mybatis的方式

mybatis單獨使用時,一般的寫法如下所示:

// mybatis初始化
String resource = "mybatis-config.xml";  
InputStream inputStream = Resources.getResourceAsStream(resource);  
// 讀取配置文件,創建SqlSessionFactory 
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 打開SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();  
// 執行SQL語句
List list = sqlSession.selectList("com.gameloft9.demo.dataaccess.dao.system.UserMapper.getByLoginName");

1.2 集成mybatis到spring的關鍵步驟

將mybatis集成到spring之后,就可以被spring的ioc容器托管,再也不用自己創建SqlSessionFactory 、打開SqlSession等操作。具體的集成方法可以參考之前寫的文章:spring集成mybatis進行數據庫訪問,其中最重要的配置就是定義好SqlSessionFactoryBean,如下所示:

<!--mybatis sqlSeesionFactory配置-->
		<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
			<property name="dataSource" ref="dataSource" />
			<property name="configLocation" value="classpath:mybatis-config.xml" />
			<property name="mapperLocations" value="classpath:mapper/*Mapper.xml" />
			<property name="typeAliasesPackage" value="com.gameloft9.demo.dataaccess.model" />
		</bean>

因此想要了解spring集成mybatis的原理,就應該從SqlSessionFactoryBean入手。

2 SqlSessionFactoryBean對象分析

SqlSessionFactoryBean,顧名思義跟SqlSessionFactory有著莫大的關系,它的類結構如下所示:

mybatis集成到spring的方式有哪些

SqlSessionFactoryBean實現了InitializingBean接口,我們知道InitializingBean在Bean的生命周期里面扮演了重要的角色,spring創建bean的流程大概是:
1、創建beanFactory
2、加載beanDefinition
3、通過反射創建bean實例
4、bean的生命周期擴展點調用
其中第4步驟又包含:
5、如果有任何與bean相關聯的BeanPostProcessors,Spring會在postProcesserBeforeInitialization()方法內調用它們。
6、如果bean實現IntializingBean了,調用它的afterPropertySet方法。
7、如果bean定義了init-method,調用init方法
8、如果有BeanPostProcessors 和bean 關聯,這些bean的postProcessAfterInitialization() 方法將被調用。
9、如果bean實現了 DisposableBean,它將調用destroy()方法。
10、如果bean定義了destroy-method,調用destroy方法。
因此在我們xml配置好的dataSource,configLocation等屬性設置好后,SqlSessionFactoryBean就在afterPropertySet()方法里面對SqlSessionFactory進行初始化。

mybatis集成到spring的方式有哪些

2.1 buildSqlSessionFactory做了什么事情?

buildSqlSessionFactory里面就是具體怎么創建SqlSeesionFactory的,代碼流程比較長,我們用一個簡單時序圖來展示:

mybatis集成到spring的方式有哪些

在解析完各種配置后,調用了return this.sqlSessionFactoryBuilder.build(configuration);來創建buildSqlSessionFactory,是不是和之前的方式很類似了?只是一個是入參是resource,一個是我們解析后的配置configuration對象。

2.2 為什么是SqlSessionFactoryBean卻可以使用SqlSessionFactory?

我們注冊的是SqlSessionFactoryBean這個bean,為什么卻說SqlSessionFactory也成為了spring的bean呢?因為我們的SqlSessionFactoryBean還實現了FactoryBean這個接口。

Spring 中有兩種類型的Bean,一種是普通Bean,另一種是工廠Bean 即 FactoryBean。FactoryBean跟普通Bean不同,其返回的對象不是指定類的一個實例,而是該FactoryBean的getObject方法所返回的對象。
一般情況下,Spring通過反射機制利用的class屬性指定實現類實例化Bean,在某些情況下,實例化Bean過程比較復雜,Spring為此提供了一個org.springframework.bean.factory.FactoryBean的工廠類接口,用戶可以通過實現該接口定制實例化Bean的邏輯。

然后回到maybatis這里,我們通過時序圖確實發現創建SqlSessionFactory十分復雜,要解析大量的配置之后才能創建,因此我們實現了FactoryBean接口:

mybatis集成到spring的方式有哪些

在getObject里面選擇性的進行初始化并返回SqlSessionFactory對象。
至于獲取SqlSessionFactorybean實例的時候,是怎么走到FactoryBean的getObject的方法的,可以參考AbstractBeanFactory.getBean方法,這屬于spring ioc范疇了,這個需要很長的篇幅才能講清楚,有機會我會單獨寫一篇spring怎么創建bean和獲取bean的。

3 驗證demo

如果你有demo的話,可以單步跟蹤。如果沒有的話,可以使用作者之前做過的一個基于layui的通用后臺系統,簡單的安裝mysql和客戶端之后(本地安裝mysql和客戶端真的很簡單30分鐘搞定吧)、稍微改下配置就可以直接運行這個項目(這個項目麻雀雖小,但五臟俱全,如果覺得好用,可以幫忙點個start)。

驗證之前,我們先做個猜想:SqlSessionFactory是在afterPropertiesSet里初始化的還是在getObject里判斷為空再初始化的?

我們分別在SqlSessionFactoryBean的afterPropertiesSet和getObject打上斷點,然后debug項目,如下所示:

mybatis集成到spring的方式有哪些

可以看到,在SqlSessionFactoryBean實例創建后,在afterPropertiesSet對SqlSessionFactory進行了初始化和創建。然后在獲取它的時候,走的是getObject方法(這時候sqlSessionFactory已經不為空了):

mybatis集成到spring的方式有哪些

4 舉一反三

4.1 插件的配置是在SqlSessionFactoryBean的定義里面還是configuration的xml結點下面?

demo里的插件我們是寫在mybatis-config.xml里面的configuration結點里面的,如下所示:

mybatis集成到spring的方式有哪些

這是通用的做法,當然你也可以經常看到有人配置在SqlSessionFactoryBean的定義里面,如下所示:

mybatis集成到spring的方式有哪些

那么問題來了,這兩個有什么區別嗎?
這個比較簡單,作者自問自答一下。
這兩個都可以作為插件的配置方式,都會起作用,因為在buildSqlSessionFactory過程中,如果發現插件不為空,就會添加到插件集合里面去,如下所示:

mybatis集成到spring的方式有哪些

然后再解析xml時,又會將configuration的配置解析一遍,里面也包含插件的解析過程:

mybatis集成到spring的方式有哪些

mybatis集成到spring的方式有哪些

所以我們只需要在一個地方配置好就行了。然后它們有一個細微的差別,因為configuration是mybatis的配置,所以在configuration中的插件配置,是通過調用setProperties方法將屬性傳遞進來,然后設置到插件的屬性中。SqlSessionFactoryBean的插件配置不會調用setProperties方法,直接走的setter注入將屬性注入進去。

mybatis集成到spring的方式有哪些

這個大家也可以自行驗證下。

4.2 mybatis的事務管理和spring的事務管理什么關系?

如果你仔細看了SqlSessionFactoryBean創建SqlSessionFactory的過程,那么肯定會注意到有這么一個調用:

if (this.transactionFactory == null) {
      this.transactionFactory = new SpringManagedTransactionFactory();
    }

因為我們配置的是spring的事務,在mybatis的配置文件里面沒有為SqlSessionFactoryBean配置事務,如下所示:

mybatis集成到spring的方式有哪些

所以那段代碼里面transactionFactory會因為==null,而創建一個SpringManagedTransactionFactory,下面的截圖也剛好印證了我們的觀點。

mybatis集成到spring的方式有哪些

那么問題來了,mybatis的事務和spring的事務是什么關系?它們是怎么配合的?
這個問題回答比較復雜,需要有spring事務的知識,大家可以嘗試自己找答案,或者等作者后續的文章來解答。

5 總結

mybatis通過SqlSessionFactoryBean將SqlSessionFactory對象集成到spring中,它實現了InitializingBean接口,在SqlSessionFactoryBean初始化時解析配置并創建DefaultSqlSessionFactory對象。它還實現了FactoryBean,在getObject時返回我們創建好的DefaultSqlSessionFactory,使得DefaultSqlSessionFactory也被spring管理起來。
很多框架集成到spring的方法基本都是靠InitializingBean和FactoryBean這兩個接口來實現的,這是一種非常好的設計,值得我們好好學習。

以上就是mybatis集成到spring的方式有哪些的簡略介紹,當然詳細使用上面的不同還得要大家自己使用過才領會。如果想了解更多,歡迎關注億速云行業資訊頻道哦!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

根河市| 海原县| 孟津县| 蓬安县| 友谊县| 桐庐县| 山阳县| 成武县| 河间市| 新乡县| 栖霞市| 民丰县| 毕节市| 贵阳市| 上蔡县| 河间市| 宣武区| 东城区| 昌图县| 琼结县| 扶风县| 屏东市| 玉屏| 改则县| 米脂县| 丽江市| 澄迈县| 通化市| 法库县| 红桥区| 渭南市| 桐庐县| 疏勒县| 平潭县| 东丰县| 景泰县| 天等县| 晋州市| 彭州市| 五寨县| 惠来县|