ibaits代码主要是以下几个类:
SqlMapClient 接口
SqlMapClientImpl 实现SqlMapClient
提供CRUD等方法
SqlMapExecutorDelegate其实SqlMapClientImpl 的CRUD方法都是由此类委托的
SqlExecutor这个类是执行的核心SqlMapExecutorDelegate的方法其实最后调用SqlExecutor的方法
---------------------------
SqlMapClient sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
public static SqlMapClient buildSqlMapClient(Reader reader) {
return new SqlMapConfigParser().parse(reader); //看SqlMapConfigParser类parse方法
}
public SqlMapClient parse(Reader reader) {
try {
usingStreams = false;
parser.parse(reader);
return state.getConfig().getClient();//关键
} catch (Exception e) {
throw new RuntimeException("Error occurred. Cause: " + e, e);
}
}
----------------------------------------------------------------------------
SqlMapConfiguration config = new SqlMapConfiguration();//硬编码
public SqlMapConfiguration() {
errorContext = new ErrorContext();
delegate = new SqlMapExecutorDelegate();
typeHandlerFactory = delegate.getTypeHandlerFactory();
client = new SqlMapClientImpl(delegate);
registerDefaultTypeAliases();
}
构造器更夸张
没有提供方法注入delegate
public SqlMapExecutorDelegate() {
mappedStatements = new HashMap();
cacheModels = new HashMap();
resultMaps = new HashMap();
parameterMaps = new HashMap();
sqlExecutor = new SqlExecutor();
typeHandlerFactory = new TypeHandlerFactory();
dataExchangeFactory = new DataExchangeFactory(typeHandlerFactory);
}
每天提供注入SqlExecutor类自己实现就要麻烦注入了!
O(∩_∩)O~ 不知道ibatis设计者为什么这样做
但是 代码 基本 都在 构造器中 new硬编码的 想注入很难
不过可以自己实现类extends以上类 然后想办法反射注入
在构造SqlMapClient 对象时间注入
当然也可以利用spring管理不过自己也要改造ibatis
下次写代码 来 说明这个问题
不过建议ibatis能够 提供构造器 和setXX注入相关 来扩展!
免得反射,或者我们自己改造源代码 不好升级