前几天看了一篇文章,名为模块化Java简介
。模块化的思想就是去耦合,这样在升级或者维护的时候都会方便一些,这样的道理大家都知道,但是怎样在实现中完成这一点呢。
作者在“类库也是模块”这一节中介绍了“类库毫无疑问也是模块。对于类库来讲,可能没有一个单一接口与之通信,但往往却有‘public
’ API(可能被用到)和‘private
’ package(文档中说明了其用途)。此外,它们也有自己依赖的类库(比如JMX
或JMS
)。这将引起自动依赖管理器引入许多并非必须的类库:以Log4J-1.2.15
为例,引入了超过10个依赖类库(包括javax.mail和javax.jms),尽管这些类库中有不少对于使用Log4J的程序来说根本不需要。 即要做到,某些情况下,一个模块的依赖可以是可选的。”
虽然文章的其他部分看不太懂,但是这个内容倒是可以考察的。Hibernate和iBATIS[注:这里使用的是iBATIS2作为示例]中的日志模块都是与他们的类库模块分开的,那么他们是怎么做到的呢?
Hibernate用的是Apache Commons Logging
开源工具做到的,而iBATIS用的其实就是自己实现的一个简化的Apache Commons Logging:
首先使用定义一个通用的接口,自己在程序中使用的就是这样一个接口:
package com.ibatis.common.logging;
public interface Log {
boolean isDebugEnabled();
void error(String s, Throwable e);
void error(String s);
public void debug(String s);
public void warn(String s);
}
LogFactory 是用来生成这个Log接口实现的工厂类
package com.ibatis.common.logging;
import java.lang.reflect.Constructor;
import com.ibatis.common.resources.Resources;
public class LogFactory {
private static Constructor logConstructor;
static {
tryImplementation("org.apache.commons.logging.LogFactory", "com.ibatis.common.logging.jakarta.JakartaCommonsLoggingImpl");
tryImplementation("org.apache.log4j.Logger", "com.ibatis.common.logging.log4j.Log4jImpl");
tryImplementation("java.util.logging.Logger", "com.ibatis.common.logging.jdk14.Jdk14LoggingImpl");
tryImplementation("java.lang.Object", "com.ibatis.common.logging.nologging.NoLoggingImpl");
}
private static void tryImplementation(String testClassName, String implClassName) {
if (logConstructor == null) {
try {
Resources.classForName(testClassName);
Class implClass = Resources.classForName(implClassName);
logConstructor = implClass.getConstructor(new Class[]{Class.class});
} catch (Throwable t) {
}
}
}
public static Log getLog(Class aClass) {
try {
return (Log)logConstructor.newInstance(new Object[]{aClass});
} catch (Throwable t) {
throw new RuntimeException("Error creating logger for class " + aClass + ". Cause: " + t, t);
}
}
}
Log4jImpl 是Log 接口的一个实例类,用来实现与log4j的交互
package com.ibatis.common.logging.log4j;
import org.apache.log4j.Logger;
public class Log4jImpl implements com.ibatis.common.logging.Log {
private Logger log;
public Log4jImpl(Class clazz) {
log = Logger.getLogger(clazz);
}
public boolean isDebugEnabled() {
return log.isDebugEnabled();
}
public void error(String s, Throwable e) {
log.error(s, e);
}
......
}
注意到这里最终还是使用了log4j的接口 import org.apache.log4j.Logger;所以说明该jar包在编译的时候还是需要log4j的,但是在实际使用的时候log4j不是必须的,这样就成功去掉了依赖。
分享到:
相关推荐
iBatis和Hibernate的区别
ibatis与hibernate区别,之中包括,现在企业为什么选择ibatis而放弃hibernate的选择,所有这里吧自由选择及。
整合了springmvc,hibernate,ibatis,jdbc等技术的强大框架,写的非常全面,谢谢老邵的成果。
ibatis 与hibernate之间的比较优点和缺点
Struts2 Spring Hibernate IBatis Struts2 Spring Hibernate IBatisStruts2 Spring Hibernate IBatisStruts2 Spring Hibernate IBatis 只需要导入相应的jar包就行了 ,数据库是mysql :数据库名叫做mydatabase,表名...
Ibatis Hibernate 分析 比较 区别
选用ibatis和hibernate的区别选用ibatis和hibernate的区别选用ibatis和hibernate的区别
ibatas的sql语句需要自己手动写,而hibernate能够在程序运行时自动生成。但是不要就这样以为hibernate比ibatas方便,其实二者熟悉之后的效率差不多。而hibernate还能够自动建表等等,这样的好处就在于你带着这个程序...
公司的大部分项目都开始使用IBatis作为O/R Mapping了,但是在使用的过程中也发现了很多不方便和存在...想了很多办法,都没能很好的避免这个问题,无意间在javaeye上看到了《使ibatis支持hibernate式的物理分页》这篇文章,
构建ibatis工程必须的两个jar包,分别为:ibatis-2.3.4.726.jar和mysql-connector-java-5.1.6-bin.jar。
hibernate下载 : http://sourceforge.net/projects/hibernate/files/hibernate3/--3.XX版本 http://sourceforge.net/projects/hibernate/files/hibernate4/--4.XX版本 IBATS下载地址:...
iBatis VS Hibernate iBatis不亚于Hibernate
描述了ibatis与hibernate的主要区别
springMVC+ibatis+hibernate+spring+boostrap框架
Spring MVC+Hibernate&Ibatis学习 例子 教程
Java面试题56.ibatis和hibernate有什么不同.mp4
在ibatis日志信息中打印SQL语句的方法(个人总结)
struts1+spring+hibernate+ibatis集成
有关Struts2+Spring+Hibernate和Struts2+Spring+Ibatis的整合实例demo 原创,完全基于eclipse开发
ibatis,hibernate 中文参考文档