1. 程式人生 > >mybatis如何利用spring擴充套件點進行整合

mybatis如何利用spring擴充套件點進行整合


mybatis會為每個mapper介面生成動態代理。每個動態代理物件都會持有sqlSession的引用。那麼mybatis如何將自己生成的代理物件交給spring管理呢?

spring和mybatis整合的時候,主要有兩點:

1.@MapperScan

@MapperScan 我們看到使用@Import註解,該註解直接往spring容器注入ImportBeanDefinitionRegistear的實現類MapperScannerRegistrar.class。執行了裡面的registerBeanDefinitions的方法,將掃描指定包下面的全部介面(mybatis已經為這些介面生成代理物件了),動態將這些的介面的代理實現類放入MapperFactoryBean這個類中。
MapperFactoryBean


其中MapperFactoryBean是實現了FactoryBean介面。getObejct裡面呼叫getSqlSession().getMapper(this.mapperInterface)生成mapper物件。那麼所有介面都變成了MapperFactoryBean物件後,又是如何區分的呢? definition.getConstructorArgumentValues().addGenericArgumentValue(definition.getBeanClassName())(getBeanClassName()返回的是String,但是為什麼MapperFactoryBean建構函式型別是Class,原因是spring不允許給構造方法傳入class物件,只能傳入該類的全路徑名)
​ 在生成MapperFactoryBean物件的時候,立即在一參構造中設定了一個值,這樣就有名稱了。

2.@Bean ——>SqlSessionFactoryBean

可以看到SqlSessionFactoryBean有實現了InitializingBean和FactoryBean(兩個介面,就這兩個懂先講)重寫了InitializingBean的afterPropertiesSet的方法,此方法將配置檔案中的各種屬性列如 mapperlocation 、typealias、plugins等等放入configuration中。並生成sqlSessionFactory物件。重寫了FactoryBean的getObject方法呼叫了afterPropertiesSet方法生成sqlSessionFactory物件(這邊是將解析配置的sqlSessionFactory放入spring中)。
通常我們配置spring的xml中SqlSessionFactoryBean,其中可以指定dataSource、configLocation、mapperLocations等。dataSource是資料原配置,configLocation是xml全域性配置檔案,mapperLocations是指定mapper.xml的位