mybatis中事務的管理和集成spring后如何將事務交給spring管理


   1.mybatis中事務的管理

    SqlSessionFactory開啟一個SqlSession后,會給當前sqlsession注入事務工廠TransactionFactory:

    

private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {    
Transaction tx = null;

try
{ final Environment environment = configuration.getEnvironment(); final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment); tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit); final Executor executor = configuration.newExecutor(tx, execType); return new DefaultSqlSession(configuration, executor, autoCommit); } catch (Exception e) { closeTransaction(tx); // may have fetched a connection so lets call close() throw ExceptionFactory.wrapException("Error opening session. Cause: " + e, e); } finally { ErrorContext.instance().reset(); } }   
//事務的生產交給
TransactionFactory

private TransactionFactory getTransactionFactoryFromEnvironment(Environment environment) { if (environment == null || environment.getTransactionFactory() == null) { return new ManagedTransactionFactory(); } return environment.getTransactionFactory(); }

 

 

所以mybatis事務的生產由TransactionFactory生產,該類是個接口,而具體實現才是執行真正邏輯的地方,在spring集成mybatis中,SpringManagedTransactionFactory實現了該接口,由此將mybatis的事務管理交給了spring進行管理

實現交接的邏輯:

  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="mapperLocations" value="classpath*:*.xml"/>
    </bean>

在spring中配置的SqlSessionFactoryBean會執行afterPropertiesSet方法,該方法會初始化SqlsessionFactory,並且設置TransactionFactory為SpringManagedTransactionFactory

 

 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.*.**"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>

MapperScannerConfigurer會執行postProcessBeanDefinitionRegistry方法,實現Mapper接口的代理,並將代理對象交給spring容器管理


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM