重构Mybatis与Spring集成的SqlSessionFactoryBean(2)
2016-11-02 16:45
585 查看
三、代码重构
1、先使用Eclipse把buildSqlSessionFactory()方法中众多的if换成小函数
说明一下:
这里的重构全部使用Eclipse完成,操作步骤是选定需要重构的代码,右键选择Refactor—>Extract Method,然后输入新的方法名,点击OK完成
新方法名规则:全部使用do开头,表示实际做某件事,对于解析XML的,使用doParse(如doParseConfig、doParseSqlMapper),其它的则使用doResolve为前缀
新方法一开始全部为private,但是为了后续扩展性,可以根据需要修改为protected
第一段的if语句,由于有两个变量需要返回,直接使用Eclipse重构不成功,先保持不变
看其中一个重构提取的方法:
View Code
(3)工厂支持类/静态帮助类
组件工厂可能会用于多个地方,因此可以添加一个Support类,可注入工厂实现类,然后其它应用继承这个Support类;也可以添加一个静态帮助类:
(4)应用,替换原来的new Xxx(),修改为SqlSessionComponetFactorys.newXxx()。
这里需要注意一点,看下面的情形:
这种直接在类定义时就赋值的组件(需要初始化的类属性),因为SqlSessionComponetFactorys中的工厂接口可能在Spring启动时修改,因此不能简单的替换,而应采用延迟创建的方式,比如修改成如下形式:
最终,SqlSessionFactoryBean重构成如下结构:
上面的数字即对应重构步骤中的操作,不包括最后一步的提取组件工厂。
1、先使用Eclipse把buildSqlSessionFactory()方法中众多的if换成小函数
protected SqlSessionFactory buildSqlSessionFactory() throws IOException { Configuration configuration; XMLConfigBuilder xmlConfigBuilder = null; if (this.configuration != null) { configuration = this.configuration; if (configuration.getVariables() == null) { configuration.setVariables(this.configurationProperties); } else if (this.configurationProperties != null) { configuration.getVariables().putAll(this.configurationProperties); } } else if (this.configLocation != null) { xmlConfigBuilder = new XMLConfigBuilder(this.configLocation.getInputStream(), null, this.configurationProperties); configuration = xmlConfigBuilder.getConfiguration(); } else { if (LOGGER.isDebugEnabled()) { LOGGER.debug( "Property `configuration` or 'configLocation' not specified, using default MyBatis Configuration"); } configuration = new Configuration(); configuration.setVariables(this.configurationProperties); } doResolveObjectFactory(configuration); doResolveObjectWrapperFactory(configuration); doResolveVfs(configuration); doResolveTypeAliasesPackage(configuration); doResolveTypeAliases(configuration); doResolvePlugins(configuration); doResolveTypeHandlersPackage(configuration); doResolveTypeHandlers(configuration); doResolveDatabaseIdProvider(configuration); doResolveCache(configuration); doParseConfig(xmlConfigBuilder); doResolveTransactionFactory(); doResolveEnvironment(configuration); doParseSqlMapper(configuration); return this.sqlSessionFactoryBuilder.build(configuration); }
说明一下:
这里的重构全部使用Eclipse完成,操作步骤是选定需要重构的代码,右键选择Refactor—>Extract Method,然后输入新的方法名,点击OK完成
新方法名规则:全部使用do开头,表示实际做某件事,对于解析XML的,使用doParse(如doParseConfig、doParseSqlMapper),其它的则使用doResolve为前缀
新方法一开始全部为private,但是为了后续扩展性,可以根据需要修改为protected
第一段的if语句,由于有两个变量需要返回,直接使用Eclipse重构不成功,先保持不变
看其中一个重构提取的方法:
public class DefaultSqlSessionComponentFactory implements ISqlSessionComponentFactory{ @Override public SqlSessionFactoryBuilder newSqlSessionFactoryBuilder() { return new SqlSessionFactoryBuilder(); } @Override public XMLConfigBuilder newXMLConfigBuilder(InputStream inputStream, String environment, Properties props) { return new XMLConfigBuilder(inputStream, environment, props); } @Override public XMLMapperBuilder newXMLMapperBuilder(InputStream inputStream, Configuration configuration, String resource, Map<String, XNode> sqlFragments) { return new XMLMapperBuilder(inputStream, configuration, resource, sqlFragments); } @Override public Configuration newConfiguration() { return new Configuration(); } @Override public Environment newEnvironment(String id, TransactionFactory transactionFactory, DataSource dataSource) { return new Environment(id, transactionFactory, dataSource); } @Override public TransactionFactory newTransactionFactory() { return new SpringManagedTransactionFactory(); } }
View Code
(3)工厂支持类/静态帮助类
组件工厂可能会用于多个地方,因此可以添加一个Support类,可注入工厂实现类,然后其它应用继承这个Support类;也可以添加一个静态帮助类:
public class SqlSessionComponetFactorys { private static ISqlSessionComponentFactory factory = new DefaultSqlSessionComponentFactory(); public static ISqlSessionComponentFactory getFactory() { return factory; } // 这里没有设置为static方法,主要是便于在Spring配置文件中注入新的工厂接口实现类 public void setFactory(ISqlSessionComponentFactory factory) { if(null != factory){ SqlSessionComponetFactorys.factory = factory; } } public static SqlSessionFactoryBuilder newSqlSessionFactoryBuilder() { return factory.newSqlSessionFactoryBuilder(); } // 省略其它的方法 }
(4)应用,替换原来的new Xxx(),修改为SqlSessionComponetFactorys.newXxx()。
这里需要注意一点,看下面的情形:
private SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
这种直接在类定义时就赋值的组件(需要初始化的类属性),因为SqlSessionComponetFactorys中的工厂接口可能在Spring启动时修改,因此不能简单的替换,而应采用延迟创建的方式,比如修改成如下形式:
private SqlSessionFactoryBuilder sqlSessionFactoryBuilder; @Override public void afterPropertiesSet() throws Exception { notNull(dataSource, "Property 'dataSource' is required"); if(null == this.sqlSessionFactoryBuilder){ this.sqlSessionFactoryBuilder = SqlSessionComponetFactorys.newSqlSessionFactoryBuilder(); } //notNull(sqlSessionFactoryBuilder, "Property 'sqlSessionFactoryBuilder' is required"); state((configuration == null && configLocation == null) || !(configuration != null && configLocation != null), "Property 'configuration' and 'configLocation' can not specified with together"); this.sqlSessionFactory = buildSqlSessionFactory(); }
最终,SqlSessionFactoryBean重构成如下结构:
上面的数字即对应重构步骤中的操作,不包括最后一步的提取组件工厂。
相关文章推荐
- 重构Mybatis与Spring集成的SqlSessionFactoryBean(1)
- 深入浅出重构Mybatis与Spring集成的SqlSessionFactoryBean(上)
- MyBatis-Spring-SqlSessionFactoryBean
- mybatis-spring整合总结02_SqlSessionFactoryBean
- MyBatis-Spring-SqlSessionFactoryBean
- spring-mybatis 之SqlSessionFactoryBean
- MyBatis-Spring-SqlSessionFactoryBean(session工厂)
- springMVC+mybatis 进行单元测试时 main SqlSessionFactoryBean - Parsed configuration file: 'class path resource' 无限的读取xml文件
- MyBatis-Spring-SqlSessionFactoryBean
- Mybatis异常:java.lang.ClassNotFoundException: org.mybatis.spring.SqlSessionFactoryBean
- mybatis-spring学习笔记之SqlSessionFactoryBean
- MyBatis -- Spring -- SqlSessionFactoryBean
- mybatis与spring集成中SqlSessionFactory创建流程
- MyBatis+Spring-SqlSessionFactoryBean
- MyBatis-Spring-SqlSessionFactoryBean(转)
- 【spring+mybatis】MyBatis-Spring-SqlSessionFactoryBean
- mybatis-spring整合总结02_SqlSessionFactoryBean
- Mybatis异常:java.lang.ClassNotFoundException: org.mybatis.spring.SqlSessionFactoryBean
- spring-mybatis 之SqlSessionFactoryBean
- MyBatis-Spring-SqlSessionFactoryBean