日志模塊結(jié)構(gòu)
Log4j2也是類似的結(jié)構(gòu)育叁,jdk14迅脐、nologging、stdout和commons則沒有委派
JDBC日志模塊則使用了代理模式
mybatis 日志模塊包結(jié)構(gòu)
mybatis 沒有自己的日志實現(xiàn)類豪嗽,而是通過接入第三方日志組件谴蔑,采用適配器模式
和代理模式
豌骏,屏蔽第三方日志組件差異,提供四種日志級別隐锭,并自動掃描日志實現(xiàn)窃躲。
Log 接口
首先定義了一個目標(biāo)接口 Log,其下定義有多個日志級別抽象方法
日志工廠類 LogFactory
用于生產(chǎn)和獲取具體日志類钦睡,內(nèi)部持有 Log 接口的構(gòu)造器蒂窒,然后在靜態(tài)代碼塊中定義了第三方日志組件的加載優(yōu)先級
靜態(tài)代碼塊中的 tryImplementation() 方法:如果 LogFactory 持有的 Log 構(gòu)造器對象 logConstructor 是空的,才會加載荞怒,進(jìn)入 setImplementation() 生產(chǎn)出對應(yīng)的日志組件洒琢,并賦值給 logConstructor
只要 logConstructor 被賦值不為空了,就不會加載靜態(tài)代碼塊中后面的日志組件
適配 Slf4j 日志組件
目標(biāo)接口:Log
兩個適配者:Logger挣输、LocationAwareLogger
適配器:Slf4Impl
這里根據(jù)版本不同纬凤,委派給不同的類(Slf4jLoggerImpl、Slf4jLocationAwareLoggerImpl)去適配