1. SqlMapClientFactoryBean:
Spring中通过SqlMapClientTemplate提供对Ibatis的支持,与Spring对Hibernate的支持类似,Spring中SqlMapClientFactoryBean就是管理Ibatis的IoC容器,我们首先分析SqlMapClientFactoryBean的源码:
[java] view plaincopyprint?
- //Spring管理Ibatis的IoC容器
- public class SqlMapClientFactoryBean implements FactoryBean<SqlMapClient>, InitializingBean {
- //当前线程绑定Ibatis blob/clob等大字段数据处理器资源
- private static final ThreadLocal<LobHandler> configTimeLobHandlerHolder = new ThreadLocal<LobHandler>();
- public static LobHandler getConfigTimeLobHandler() {
- return configTimeLobHandlerHolder.get();
- }
- //Ibatis配置文件路径
- private Resource[] configLocations;
- //Ibatis映射文件路径
- private Resource[] mappingLocations;
- //Ibatis sqlMapClient属性
- private Properties sqlMapClientProperties;
- //数据源
- private DataSource dataSource;
- //使用Spring事务包装数据源
- private boolean useTransactionAwareDataSource = true;
- //事务配置类
- private Class transactionConfigClass = ExternalTransactionConfig.class;
- //事务配置属性
- private Properties transactionConfigProperties;
- //blob/clob等lob类型处理器
- private LobHandler lobHandler;
- //Ibatis sqlMapClient
- private SqlMapClient sqlMapClient;
- public SqlMapClientFactoryBean() {
- this.transactionConfigProperties = new Properties();
- //不允许事务自动提交
- this.transactionConfigProperties.setProperty("SetAutoCommitAllowed", "false");
- }
- //指定Ibatis sqlMapClient配置文件路径
- public void setConfigLocation(Resource configLocation) {
- this.configLocations = (configLocation != null ? new Resource[] {configLocation} : null);
- }
- //指定多个sqlMapClient配置文件路径,这些配置文件在运行时合并
- public void setConfigLocations(Resource[] configLocations) {
- this.configLocations = configLocations;
- }
- //指定Ibatis映射文件路径,这些映射文件在运行时被合并到SqlMapClient的配置中
- public void setMappingLocations(Resource[] mappingLocations) {
- this.mappingLocations = mappingLocations;
- }
- //指定Ibatis SqlMapClient可选的属性,即在SqlMapClient配置文件中通过属性
- //文件设置的属性
- public void setSqlMapClientProperties(Properties sqlMapClientProperties) {
- this.sqlMapClientProperties = sqlMapClientProperties;
- }
- //设置Ibatis使用的数据源
- public void setDataSource(DataSource dataSource) {
- this.dataSource = dataSource;
- }
- //设置数据源是否使用事务包装
- public void setUseTransactionAwareDataSource(boolean useTransactionAwareDataSource) {
- this.useTransactionAwareDataSource = useTransactionAwareDataSource;
- }
- //设置Ibatis使用的事务配置类,默认是//com.ibatis.sqlmap.engine.transaction.external.ExternalTransactionConfig
- public void setTransactionConfigClass(Class transactionConfigClass) {
- if (transactionConfigClass == null || !TransactionConfig.class.isAssignableFrom(transactionConfigClass)) {
- throw new IllegalArgumentException("Invalid transactionConfigClass: does not implement " +
- "com.ibatis.sqlmap.engine.transaction.TransactionConfig");
- }
- this.transactionConfigClass = transactionConfigClass;
- }
- //设置Ibatis事务配置类属性
- public void setTransactionConfigProperties(Properties transactionConfigProperties) {
- this.transactionConfigProperties = transactionConfigProperties;
- }
- //设置Ibatis使用的处理clob/blob等大字段的处理器
- public void setLobHandler(LobHandler lobHandler) {
- this.lobHandler = lobHandler;
- }
- //IoC容器初始化完成之后的回调方法,是InitializingBean接口的实现方法
- public void afterPropertiesSet() throws Exception {
- //配置lob处理器
- if (this.lobHandler != null) {
- configTimeLobHandlerHolder.set(this.lobHandler);
- }
- //创建Ibatis的SqlMapClient
- try {
- this.sqlMapClient = buildSqlMapClient(this.configLocations, this.mappingLocations, this.sqlMapClientProperties);
- //为创建的SqlMapClient设置数据源
- if (this.dataSource != null) {
- //创建事务配置实例
- TransactionConfig transactionConfig = (TransactionConfig) this.transactionConfigClass.newInstance();
- //获取数据源
- DataSource dataSourceToUse = this.dataSource;
- //如果Ibatis配置指定使用事务包装的数据源,并且当前获取到的数据源
- //不是事务包装数据源代理类型
- if (this.useTransactionAwareDataSource && !(this.dataSource instanceof TransactionAwareDataSourceProxy)) {
- //为指定数据源创建事务包装代理
- dataSourceToUse = new TransactionAwareDataSourceProxy(this.dataSource);
- }
- //事务配置对象设置数据源
- transactionConfig.setDataSource(dataSourceToUse);
- //初始化事务配置对象 transactionConfig.initialize(this.transactionConfigProperties);
- applyTransactionConfig(this.sqlMapClient,