iBATIS的Log使用的两个类如下:
private
static
void
tryImplementation(String testClassName, String implClassName)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if (logConstructor == null) ...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
try ...{
Resources.classForName(testClassName);
Class implClass = Resources.classForName(implClassName);
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
logConstructor = implClass.getConstructor(new Class[]...{Class.class});
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
} catch (Throwable t) ...{
}
}
}
com.ibatis.common.logging.LogFactory
com.ibatis.common.logging.Log
查看这两个类的源代码,可以发现它不过是对org.apache.commons.logging、org.apache.log4j、java.util.logging,三种目前可用的Log框架的同时封装。
开始时很费解,不知iBATIS开发者为何要采用这种方式,直接使用某个确定的Log不就可以了吗?思考后发现原因如下:
“iBATIS宣称自己具有最少的第三方依赖性,其Log采用以上机制的原因也正在于此:如果iBATIS采用某个特定的Log框架,那么它就必须添加对该框架的依赖关系;而考虑到使用iBATIS的开发者肯定会使用以上三个Log框架中的某个,因此iBATIS决定与其使用者共用该框架;这样iBATIS就可以避免不必要的第三方依赖;另外,如果开发者的确没有使用某Log框架,查看iBATIS的Log代码可以发现它对此也有相应措施,即不log出任何东西。”
思考明白以上原因后,再查看com.ibatis.common.logging.LogFactory的代码,就不难理解了,但还是说明几个小点:
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
testClassName为某Log框架中的工厂类的类名,
implClassName为该框架相应Log接口实现类的类名(该类属于iBATIS)。代码先加载工厂类,然后加载实现类,得到其class,并由class得到constructor,供getLog方法调用时使用。