最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mybatis集成到spring的方式詳解

 更新時(shí)間:2023年05月15日 09:33:45   作者:GAMELOFT9  
這篇文章主要介紹了mybatis是如何集成到spring的,將mybatis集成到spring之后,就可以被spring的ioc容器托管,再也不用自己創(chuàng)建SqlSessionFactory?、打開SqlSession等操作,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下

1 前言

1.1 集成spring前使用mybatis的方式

mybatis單獨(dú)使用時(shí),一般的寫法如下所示:

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

1.2 集成mybatis到spring的關(guān)鍵步驟

將mybatis集成到spring之后,就可以被spring的ioc容器托管,再也不用自己創(chuàng)建SqlSessionFactory 、打開SqlSession等操作。具體的集成方法可以參考之前寫的文章:spring集成mybatis進(jìn)行數(shù)據(jù)庫訪問,其中最重要的配置就是定義好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的原理,就應(yīng)該從SqlSessionFactoryBean入手。

2 SqlSessionFactoryBean對象分析

SqlSessionFactoryBean,顧名思義跟SqlSessionFactory有著莫大的關(guān)系,它的類結(jié)構(gòu)如下所示:

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

2.1 buildSqlSessionFactory做了什么事情?

buildSqlSessionFactory里面就是具體怎么創(chuàng)建SqlSeesionFactory的,代碼流程比較長,我們用一個(gè)簡單時(shí)序圖來展示:

在解析完各種配置后,調(diào)用了return this.sqlSessionFactoryBuilder.build(configuration);來創(chuàng)建buildSqlSessionFactory,是不是和之前的方式很類似了?只是一個(gè)是入?yún)⑹莚esource,一個(gè)是我們解析后的配置configuration對象。

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

我們注冊的是SqlSessionFactoryBean這個(gè)bean,為什么卻說SqlSessionFactory也成為了spring的bean呢?因?yàn)槲覀兊腟qlSessionFactoryBean還實(shí)現(xiàn)了FactoryBean這個(gè)接口。

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

然后回到maybatis這里,我們通過時(shí)序圖確實(shí)發(fā)現(xiàn)創(chuàng)建SqlSessionFactory十分復(fù)雜,要解析大量的配置之后才能創(chuàng)建,因此我們實(shí)現(xiàn)了FactoryBean接口:

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

3 驗(yàn)證demo

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

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

我們分別在SqlSessionFactoryBean的afterPropertiesSet和getObject打上斷點(diǎn),然后debug項(xiàng)目,如下所示:

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

4 舉一反三

4.1 插件的配置是在SqlSessionFactoryBean的定義里面還是configuration的xml結(jié)點(diǎn)下面?

demo里的插件我們是寫在mybatis-config.xml里面的configuration結(jié)點(diǎn)里面的,如下所示:

這是通用的做法,當(dāng)然你也可以經(jīng)??吹接腥伺渲迷赟qlSessionFactoryBean的定義里面,如下所示:

那么問題來了,這兩個(gè)有什么區(qū)別嗎?
這個(gè)比較簡單,作者自問自答一下。
這兩個(gè)都可以作為插件的配置方式,都會(huì)起作用,因?yàn)樵赽uildSqlSessionFactory過程中,如果發(fā)現(xiàn)插件不為空,就會(huì)添加到插件集合里面去,如下所示:

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

所以我們只需要在一個(gè)地方配置好就行了。然后它們有一個(gè)細(xì)微的差別,因?yàn)閏onfiguration是mybatis的配置,所以在configuration中的插件配置,是通過調(diào)用setProperties方法將屬性傳遞進(jìn)來,然后設(shè)置到插件的屬性中。SqlSessionFactoryBean的插件配置不會(huì)調(diào)用setProperties方法,直接走的setter注入將屬性注入進(jìn)去。

這個(gè)大家也可以自行驗(yàn)證下。

4.2 mybatis的事務(wù)管理和spring的事務(wù)管理什么關(guān)系?

如果你仔細(xì)看了SqlSessionFactoryBean創(chuàng)建SqlSessionFactory的過程,那么肯定會(huì)注意到有這么一個(gè)調(diào)用:

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

因?yàn)槲覀兣渲玫氖莝pring的事務(wù),在mybatis的配置文件里面沒有為SqlSessionFactoryBean配置事務(wù),如下所示:

所以那段代碼里面transactionFactory會(huì)因?yàn)?=null,而創(chuàng)建一個(gè)SpringManagedTransactionFactory,下面的截圖也剛好印證了我們的觀點(diǎn)。

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

5 總結(jié)

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

到此這篇關(guān)于mybatis是如何集成到spring的的文章就介紹到這了,更多相關(guān)mybatis集成spring內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Springboot集成ProtoBuf的實(shí)例

    Springboot集成ProtoBuf的實(shí)例

    這篇文章主要介紹了Springboot集成ProtoBuf的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • IDEA如何加載resources文件夾下文件相對路徑

    IDEA如何加載resources文件夾下文件相對路徑

    這篇文章主要介紹了IDEA如何加載resources文件夾下文件相對路徑問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • JAVA通過XPath解析XML性能比較詳解

    JAVA通過XPath解析XML性能比較詳解

    本篇文章主要介紹了JAVA通過XPath解析XML性能比較詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • 解析Java多線程之常見鎖策略與CAS中的ABA問題

    解析Java多線程之常見鎖策略與CAS中的ABA問題

    本篇文章介紹了常見的鎖策略,并說明了synchronized關(guān)鍵字加的鎖類型不是單一一種鎖類型的,根據(jù)可重入鎖與非可重入鎖引出了死鎖的概念與死鎖條件,最后介紹了CAS指令以及CAS鎖產(chǎn)生的ABA問題及其解決方案,需要的朋友可以參考下
    2022-06-06
  • Flyway詳解及Springboot集成Flyway的詳細(xì)教程

    Flyway詳解及Springboot集成Flyway的詳細(xì)教程

    Flayway是一款數(shù)據(jù)庫版本控制管理工具,,支持?jǐn)?shù)據(jù)庫版本自動(dòng)升級,Migrations可以寫成sql腳本,也可以寫在java代碼里。這篇文章主要介紹了Flyway詳解及Springboot集成Flyway的詳細(xì)教程的相關(guān)資料,需要的朋友可以參考下
    2020-07-07
  • Springboot引用外部配置文件的方法步驟

    Springboot引用外部配置文件的方法步驟

    這篇文章主要介紹了Springboot引用外部配置文件的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java for循環(huán)常見優(yōu)化方法案例詳解

    Java for循環(huán)常見優(yōu)化方法案例詳解

    這篇文章主要介紹了Java for循環(huán)常見優(yōu)化方法案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • java使用@Transactional時(shí)常犯的N種錯(cuò)誤

    java使用@Transactional時(shí)常犯的N種錯(cuò)誤

    @Transactional是我們在用Spring時(shí)候幾乎逃不掉的一個(gè)注解,本文主要介紹了使用?@Transactional?時(shí)常犯的N種錯(cuò)誤,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java列表元素自定義排序方式

    Java列表元素自定義排序方式

    文章介紹了在Java開發(fā)中如何對列表元素進(jìn)行自定義排序,通過實(shí)現(xiàn)`Comparator`接口并重寫`compare`方法來指定自定義排序規(guī)則,示例展示了如何對漢字?jǐn)?shù)字進(jìn)行排序,并通過改變自定義順序列表的元素添加順序來實(shí)現(xiàn)倒序排序
    2024-12-12
  • SpringBoot中的@CrossOrigin注解詳解

    SpringBoot中的@CrossOrigin注解詳解

    這篇文章主要介紹了SpringBoot中的@CrossOrigin注解詳解,跨源資源共享(CORS)是由大多數(shù)瀏覽器實(shí)現(xiàn)的W3C規(guī)范,允許您靈活地指定什么樣的跨域請求被授權(quán),而不是使用一些不太安全和不太強(qiáng)大的策略,需要的朋友可以參考下
    2023-11-11

最新評論

定州市| 公主岭市| 太原市| 唐山市| 潜山县| 中宁县| 平湖市| 高阳县| 嵊泗县| 嵩明县| 南宁市| 定边县| 枞阳县| 鹤岗市| 莱西市| 文安县| 繁昌县| 杨浦区| 宿迁市| 宜春市| 左贡县| 大洼县| 丽水市| 勃利县| 大化| 朝阳区| 上虞市| 固安县| 吉安市| 邮箱| 乡城县| 大连市| 盈江县| 株洲市| 韩城市| 尤溪县| 汤原县| 北海市| 青河县| 卫辉市| 桃源县|