您的位置:首页 > 编程语言 > Java开发

重构Mybatis与Spring集成的SqlSessionFactoryBean(2)

2016-11-02 16:45 585 查看
三、代码重构

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重构成如下结构:



上面的数字即对应重构步骤中的操作,不包括最后一步的提取组件工厂。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: