Mybatis日志模塊的適配器模式詳解
Mybatis的日志模塊的適配器模式
我們在開發(fā)中日志是必不可少的一部分,而市場中有很多日志框架供我們使用,mybatis作為一個開源框架需要兼容這些框架,mybatis用了適配器模式來兼容這些框架,適配器模式就是通過組合的方式,將需要適配的類轉(zhuǎn)為使用者能夠使用的接口
下面咱們分析一下mybatis的日志模塊
mybatis定義了自己的Log接口
Log接口
public interface Log { boolean isDebugEnabled(); boolean isTraceEnabled(); void error(String s, Throwable e); void error(String s); void debug(String s); void trace(String s); void warn(String s); }
這里定義了一些常用的方法
LogFactory的靜態(tài)代碼塊加載對應(yīng)是日志適配器:
日志工廠類LogFactory
static { tryImplementation(LogFactory::useSlf4jLogging); tryImplementation(LogFactory::useCommonsLogging); tryImplementation(LogFactory::useLog4J2Logging); tryImplementation(LogFactory::useLog4JLogging); tryImplementation(LogFactory::useJdkLogging); tryImplementation(LogFactory::useNoLogging); } private static void tryImplementation(Runnable runnable) { if (logConstructor == null) { try { runnable.run(); } catch (Throwable t) { // ignore } } } public static synchronized void useLog4JLogging() { setImplementation(org.apache.ibatis.logging.log4j.Log4jImpl.class); }
當(dāng)logConstructor用來記錄日志適配器的構(gòu)造方法,當(dāng)logConstructor不為空的時候就不再加載其他的日志適配器了。
分析一下setImplementation()方法:
private static void setImplementation(Class<? extends Log> implClass) { try { Constructor<? extends Log> candidate = implClass.getConstructor(String.class); Log log = candidate.newInstance(LogFactory.class.getName()); if (log.isDebugEnabled()) { log.debug("Logging initialized using '" + implClass + "' adapter."); } logConstructor = candidate; } catch (Throwable t) { throw new LogException("Error setting Log implementation. Cause: " + t, t); } }
- 獲取適配器的構(gòu)造方法
- 然后獲取這個適配器的實例,如果獲取成功,把它的構(gòu)造方法記錄在logConstructor中,否則就會拋出異常
下面就分析一下Log4jImpl類:
Log接口的實現(xiàn)類
public class Log4jImpl implements Log { private static final String FQCN = Log4jImpl.class.getName(); private final Logger log; public Log4jImpl(String clazz) { log = Logger.getLogger(clazz); } @Override public boolean isDebugEnabled() { return log.isDebugEnabled(); } @Override public boolean isTraceEnabled() { return log.isTraceEnabled(); } @Override public void error(String s, Throwable e) { log.log(FQCN, Level.ERROR, s, e); } @Override public void error(String s) { log.log(FQCN, Level.ERROR, s, null); } @Override public void debug(String s) { log.log(FQCN, Level.DEBUG, s, null); } @Override public void trace(String s) { log.log(FQCN, Level.TRACE, s, null); } @Override public void warn(String s) { log.log(FQCN, Level.WARN, s, null); } }
Log4jImpl是一個適配器類,它實現(xiàn)了Mybatis自定義的Log接口,它的成員變量Logger是log4j里的類,我們要做的是調(diào)用Log接口的方法就可以使用log4j,Logger是需要我們適配的類,因此我們在實現(xiàn)Log接口的方法的時候調(diào)用Logger中的方法來完成適配,這就是適配器模式的實現(xiàn)
總結(jié)
Mybatis日志模塊用到了適配器模式,Log接口是目標(biāo)接口,Logger等各種日志框架的類是需要我們適配的類,而是適配器是Log4jImpl、Slf4jImpl等適配類
到此這篇關(guān)于Mybatis日志模塊的適配器模式詳解的文章就介紹到這了,更多相關(guān)Mybatis適配器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java jackson 將對象轉(zhuǎn)json時,忽略子對象的某個屬性操作
這篇文章主要介紹了java jackson 將對象轉(zhuǎn)json時,忽略子對象的某個屬性操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10SpringCloud讓微服務(wù)實現(xiàn)指定程序調(diào)用
這篇文章主要介紹了SpringCloud讓微服務(wù)實現(xiàn)指定程序調(diào)用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06Java 中組合模型之對象結(jié)構(gòu)模式的詳解
這篇文章主要介紹了Java 中組合模型之對象結(jié)構(gòu)模式的詳解的相關(guān)資料,希望通過本文能幫助到大家理解應(yīng)用對象結(jié)構(gòu)模型,需要的朋友可以參考下2017-09-09SpringBoot+ThreadLocal+AbstractRoutingDataSource實現(xiàn)動態(tài)切換數(shù)據(jù)源
最近在做業(yè)務(wù)需求時,需要從不同的數(shù)據(jù)庫中獲取數(shù)據(jù)然后寫入到當(dāng)前數(shù)據(jù)庫中,因此涉及到切換數(shù)據(jù)源問題,所以本文采用ThreadLocal+AbstractRoutingDataSource來模擬實現(xiàn)dynamic-datasource-spring-boot-starter中線程數(shù)據(jù)源切換,需要的朋友可以參考下2023-08-08springboot web項目打jar或者war包并運行的實現(xiàn)
這篇文章主要介紹了springboot web項目打jar或者war包并運行的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Spring常用注解 使用注解來構(gòu)造IoC容器的方法
下面小編就為大家分享一篇Spring常用注解 使用注解來構(gòu)造IoC容器的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01spring+mybatis 通過@ResponseBody返回結(jié)果中文亂碼的解決方法
下面小編就為大家分享一篇spring+mybatis 通過@ResponseBody返回結(jié)果中文亂碼的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12