SqlSessionFactoryBean的构建流程
目的
此文的主旨在于梳理SqlSessionFactoryBean的初始流程,不拘泥于實現細節。
使用
SqlSessionFactoryBean的主要作用便是用來創建SqlSessionFactory,在它的構建過程中會解析MyBatis所需要的配置文件,將所有配置都封裝到Configuration類中,最后返回SqlSessionFactory實例。SqlSessionFactoryBean實現了Spring中兩個用于初始化Bean的接口FactoryBean、InitializingBean.
InitializingBean定義如下
public interface InitializingBean {/*** 此方法在BeanFactory設置了Bean配置里的所有屬性后執行。*/void afterPropertiesSet() throws Exception;
} 我們一般在XML中都會有這么一段配置,如下:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 注入連接池 --><property name="dataSource" ref="dataSource"/><!--主配置 --><property name="configuration"><bean class="org.apache.ibatis.session.Configuration"><property name="mapUnderscoreToCamelCase" value="true"/></bean></property><!-- 加載mybatis映射文件 --><property name="mapperLocations" value="classpath:mappers/*.xml"/>
</bean> 上述配置的作用就是讓容器創建一個ID為sqlSessionFactory的SqlSessionFactoryBean實例,并且為實例指定了datasource屬性,手動指定了主配置對象,開啟MyBatis下劃線轉駝峰的屬性配置,并且指定映射文件所在的位置。
注:
雖然指定的是SqlSessionFactoryBean實例,但是因為繼承了FactoryBean接口,因此我們從容器拿到的對象實際上是getObject方法返回的對象,即SqlSessionFactory實例。
創建流程
首先自不用說,Spring會創建SqlSessionFactoryBean實例,設置配置的所有屬性,這是第一步,接下來便會走afterPropertiesSet()方法。
@Override
public void afterPropertiesSet() throws Exception {// 檢查數據源notNull(dataSource, "Property 'dataSource' is required");// 檢查SqlSessionFactoryBuilder, 已經在構造方法里初始化notNull(sqlSessionFactoryBuilder, "Property 'sqlSessionFactoryBuilder' is required");// configuration實例與configLocation只能有一個state((configuration == null && configLocation == null) || !(configuration != null && configLocation != null),"Property 'configuration' and 'configLocation' can not specified with together");// 解析配置文件,創建SqlSessionFactory。這屬于MyBatis本身的內容,不再展開說明。this.sqlSessionFactory = buildSqlSessionFactory();
} 創建SqlSessionFactory的過程與MyBatis不同的點主要在與transactionFactory,在創建事務工廠時不再使用MyBatis自帶的JdbcTransaction類,而是使用SpringManagedTransactionFactory這個新的事務工廠類,這個事務獲取到的連接全部來自于Spring管理,這樣把事務全權交給Spring管理,而MyBatis本身不再涉及事務管理。如果在使用Spring時沒有配置(使用)事務,那么獲取到的連接取決于DataSource,無論拿到的連接是自動提交還是手動提交,MyBatis每一次方法調用都會視情況提交或回滾。當然對于自動提交而言,MyBatis的commit或者rollbakc是不會調用conn.commit()或conn.rollback。
在經過afterPropertiesSet方法后,SqlSessionFactory實例便創建完畢。需要使用SqlSessionFactory實例便會調用getObject方法。
@Override
public SqlSessionFactory getObject() throws Exception {if (this.sqlSessionFactory == null) {afterPropertiesSet();}return this.sqlSessionFactory;
}
轉載于:https://www.cnblogs.com/wt20/p/10470872.html
總結
以上是生活随笔為你收集整理的SqlSessionFactoryBean的构建流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个姓欧阳好听的男孩名字。
- 下一篇: 求一个成功人士的微信网名