【十二】圖解mybatis日志模塊之設計模式

圖解mybatis日志模塊之設計模式

概述

? ? ? ? 最近經常在思考研發工程師初、中、高級工程師以及系統架構師各個級別的工程師有什么區別,隨著年齡增加我們的技術級別也在提升,但是很多人到了高級別反而更加憂慮,因為it行業35歲年齡是個坎這是行業里的共識,我覺得只要你名副其實就沒有什么焦慮的,因為任何行業高端人才肯定是成金字塔型的。要做到不焦慮我們就需要知己知彼,明確不同級別工程師的差異,而不是成為PPT工程師,到了高級工程師級別往上我們不但要具備技術的廣度還有對一些技術有深度了解,并且能夠吸收優秀軟件的設計思維形成自己的一套解決方案,成為某一方面的專家。

? ? ? ? 要形成自己的一套解決方案,我們需要擅長做軟件設計,而做好軟件設計我們需要不斷吸收優秀開源軟件的設計思想,本文將使用圖解的方式詳細分析mybatis日志模塊之設計模式的運用。

一、單例模式

????????單例模式(Singleton),保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。結構圖如下圖所示:

? ? ? ? 首先在日志模塊我們看到如下圖所示的代碼,很明顯這里應用了單例模式。

二、簡單工廠模式

????????簡單工廠模式(Simple Factory Pattern):定義一個工廠類,它可以根據參數的不同返回不同類的實例,被創建的實例通常都具有共同的父類。因為在簡單工廠模式中用于創建實例的方法是靜態(static)方法,因此簡單工廠模式又被稱為靜態工廠方法(Static Factory Method)模式,它屬于類創建型模式。結構圖如下圖所示:

? ? ? ? 在mybatis中LogFactory就是一個工廠類,會根據環境中不同日志配置來實例化日志對象,如下圖所示:

三、適配器模式

????????適配器模式(Adapter Pattern):將一個接口轉換成客戶希望的另一個接口,使接口不兼容的那些類可以一起工作,其別名為包裝器(Wrapper)。適配器模式既可以作為類結構型模式,也可以作為對象結構型模式。結構圖如下所示:

? ? ? ? mybatis為了適配各種不同日志框架的實現,設計了Log接口,從而實現了各種日志框架適配Log接口,如下圖所示:

NoLogginImpl:? ? ? ? ? ? ? ? ? ? ? ? ? ? 無日志的實現,不打印日志直接返回
Sfl4jImpl:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 適配Sfl4j的實現
Jdk14LoggingImpl:? ? ? ? ? ? ? ? ? ? ?適配使用Jdk Logging框架
JakartaCommonsLoggingImpl:? 適配使用Apache Commons Logging
Log4jImpl:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 適配Log4j
Log4j2Impl:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 適配Log4j2
StdOutImpl:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 適配直接使用System.out.println()打印日志

如下以Slf4jImpl實現為例

package org.apache.ibatis.logging.slf4j;import org.apache.ibatis.logging.Log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.Marker;
import org.slf4j.spi.LocationAwareLogger;/*** @author Clinton Begin* @author Eduardo Macarron* @author kit* @date 20200905*/
public class Slf4jImpl implements Log {private Log log;public Slf4jImpl(String clazz) {Logger logger = LoggerFactory.getLogger(clazz);if (logger instanceof LocationAwareLogger) {try {// check for slf4j >= 1.6 method signaturelogger.getClass().getMethod("log", Marker.class, String.class, int.class, String.class, Object[].class, Throwable.class);log = new Slf4jLocationAwareLoggerImpl((LocationAwareLogger) logger);return;} catch (SecurityException | NoSuchMethodException e) {// fail-back to Slf4jLoggerImpl}}// Logger is not LocationAwareLogger or slf4j version < 1.6log = new Slf4jLoggerImpl(logger);}@Overridepublic boolean isDebugEnabled() {return log.isDebugEnabled();}@Overridepublic boolean isTraceEnabled() {return log.isTraceEnabled();}@Overridepublic void error(String s, Throwable e) {log.error(s, e);}@Overridepublic void error(String s) {log.error(s);}@Overridepublic void debug(String s) {log.debug(s);}@Overridepublic void trace(String s) {log.trace(s);}@Overridepublic void warn(String s) {log.warn(s);}}

可以看到在構造方法中實現了適配能力。

總結

? ? ? ? 閱讀優秀開源項目開源真切體會到軟件優秀的設計思想,當哪天你能看懂代碼設計的好壞,并且在自己實際工作中對設計多一些思考,那么你將不再會有焦慮,因為你的能力名副其實。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/21873.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21873.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/21873.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一文讀懂數據庫中的DB、DBMS、DBS、DBAS

目前數據庫的應用非常廣泛,幾乎各行各業都在直接或間接地與數據庫打交道,例如網上購物、銀行業務、鐵路購票和酒店住宿等。在實際應用中,數據庫、數據庫管理系統、數據庫系統和數據庫應用系統經常被統稱為數據庫,而實質上這4個概念是不一樣的,它們具有不同的定義和含義。下…

暴力數據結構之排序大雜燴

1. 冒泡排序&#xff1a;O(N^2) 邏輯解析&#xff1a; 冒泡排序并沒有什么實際意義&#xff0c;但是有教學意義&#xff0c;相信大部分小白在學習的初期第一個接觸的排序就是冒泡排序。那么接下來我們了解一下他的底層邏輯&#xff1a; 冒泡排序顧名思義就是將最大&#xff08…

PID——調參的步驟

第一步&#xff1a;確定比例增益P 確定比例增益 P 時&#xff0c;首先去掉 PID 的積分項和微分項&#xff0c;一般是令 Ti0、 Td0&#xff08;具體見PID 的參數設定說明&#xff09;&#xff0c;使PID 為純比例調節。 輸入設定為系統允許的最大值60%~70%&#xff0c;由0逐漸加…

idea項目maven下載依賴報錯

報錯&#xff1a; 1、Failure to find bad.robot:simple-excel:jar:1.0 in https://maven.aliyun.com/repository/public was cached in the local repository, resolution will not be reattempted until the update interval of aliyunmaven has elapsed or updates are forc…

python的while循環與for循環總結

前兩章中&#xff0c;我們跟著海綿寶寶的故事&#xff0c;掌握了 while 循環和 for 循環&#xff0c;這兩種不同的循環模式。while 循環和 for 循環都需要有 循環體 和 縮進&#xff0c;我們來復習一下它倆的語法規則&#xff1a; while 循環與 for 循環辨析 學到這里&#x…

Microsoft Edge TTS引擎實現文字轉語音小工具

Microsoft Edge TTS引擎實現文字轉語音小工具 ? 看了一篇文章關于使用Microsoft Edge TTS引擎進行文本轉語音的介紹。正好單位工作上經常用到音視頻的制作和轉換。但是文字變成音頻一直都是播音員口播實現。現在到了AI時代,各種功能強大的AI大模型已經應用到各個領域,大大提…

Docker鏡像導入導出

Docker鏡像導入導出 相關命令 docker export 容器id > x:/xx/xx.tar ##導出容器快照 docker import - x:/xx/xx.tar ##導入容器快照 docker save 鏡像id > x:/xx/xx.tar ##導出鏡像 docker load < x:/xx/xx.tar ##導入鏡像命令詳解 docker save …

在鯤鵬服務器搭建k8s高可用集群分享

高可用架構 本文采用kubeadm方式搭建k8s高可用集群&#xff0c;k8s高可用集群主要是對apiserver、etcd、controller-manager、scheduler做的高可用&#xff1b;高可用形式只要是為&#xff1a; 1. apiserver利用haproxykeepalived做的負載&#xff0c;多apiserver節點同時工作…

nginx反向代理了解

文章目錄 Nginx反向代理反向代理系統調優Proxy Buffer相關指令 Nginx 具有高性能的http和反向代理的web服務器&#xff0c;同時也是一個pop3/smtp/imap代理服務器&#xff0c;使用c語言編寫 **Web服務器&#xff1a;**也叫網頁服務器&#xff0c;web server&#xff0c;主要功…

易聯眾智慧云膠片平臺,助推醫學影像服務“向云端”

在門診室里,張女士焦急地告訴主治醫師,自己忘了帶CT膠片。“您別急,我用系統查詢一下。”醫生輕點幾下鼠標進入云膠片平臺,只用不到10秒就順利完成了影像調取。“不僅我可以看到,您在手機上也能隨時隨地查閱。”張女士根據提示操作,不僅能調閱自己的影像檔案,連抽血化驗結果都可…

Spring MVC 啟動流程?

在 web.xml 文件中給 Spring MVC 的 Servlet 配置了 load-on-startup&#xff0c;所以程序啟動的時候會初始化 Spring MVC&#xff0c;在 HttpServletBean 中將配置的 contextConfigLocation屬性設置到 Servlet 中&#xff0c;然后在FrameworkServlet 中創建了 WebApplicationC…

[GeoServer系列]Shapefile數據發布

【GeoServer系列】——安裝與發布shapefile數據-CSDN博客 將待發布數據放置指定目錄下 webapps\geoserver\data\data 創建存儲倉庫 新建矢量數據源 發布圖層 設置邊框 設置樣式 使用 方式1 let highRoad new Cesium.WebMapServiceImageryProvider({url: http://local…

blender從視頻中動作捕捉,綁定到人物模型

總共分為3個步驟&#xff1a; 1、從視頻中捕捉動作模型 小K動畫網-AIGC視頻動捕平臺 地址&#xff1a;https://xk.yunbovtb.com/ 需要注冊 生成的FBX文件&#xff0c;不能直接導入到blender中&#xff0c; 方法有2種&#xff1a; 第一種&#xff1a;需要轉換一下&#x…

Spring Cloud學習筆記(Nacos):Nacos持久化(未完成)

這是本人學習的總結&#xff0c;主要學習資料如下 - 馬士兵教育 1、Overview2、單機使用MySQL 1、Overview 我們關閉單機下的Nacos后&#xff0c;再重新啟動會發現之前配置的內容沒有被刪除。這時因為Nacos有內嵌的數據庫derby&#xff0c;會自己持久化。 但是在集群的情況下…

QT6.0以上版本實現實時圖像傳輸

目錄 服務端開啟攝像頭&#xff0c;捕獲存儲圖片TCP圖像傳輸延時函數 客戶端建立連接接收數據和處理緩沖區接收的一些想法 QT借助tcp實現圖像傳輸&#xff0c;達到類似實時監控的目的。 QT到6.0以上后貌似原來的5.0的一些圖像的捕獲的函數都無法使用了&#xff0c;網上好像也沒…

KAN(Kolmogorov-Arnold Network)的理解 3

系列文章目錄 第一部分 KAN的理解——數學背景 第二部分 KAN的理解——網絡結構 第三部分 KAN的實踐——第一個例程 文章目錄 系列文章目錄前言KAN 的第一個例程 get started 前言 這里記錄我對于KAN的探索過程&#xff0c;每次會嘗試理解解釋一部分問題。歡迎大家和我一起討…

百度/迅雷/夸克,網盤免費加速,已破!

哈嘍&#xff0c;各位小伙伴們好&#xff0c;我是給大家帶來各類黑科技與前沿資訊的小武。 之前給大家安利了百度網盤及迅雷的加速方法&#xff0c;詳細方法及獲取參考之前文章&#xff1a; 剛剛&#xff01;度盤、某雷已破&#xff01;速度50M/s&#xff01; 本次主要介紹夸…

Python sorted 用法:深入解析排序函數的奧秘

Python sorted 用法&#xff1a;深入解析排序函數的奧秘 在Python編程中&#xff0c;sorted函數是一個強大的工具&#xff0c;用于對可迭代對象進行排序。然而&#xff0c;它的用法和功能遠不止表面看起來那么簡單。本文將深入剖析sorted函數的四個方面、五個方面、六個方面和…

simulink基礎學習筆記

寫在前面 這個筆記是看B站UP 快樂的宇航boy 所出的simulink基礎教程系列視頻過程中記下來的&#xff0c;寫的很粗糙不完整&#xff0c;也不會補。視頻教程很細跟著做就行。 lesson1-7節的筆記up有&#xff0c;可以加up的群&#xff0c;里面大佬挺活躍的。 lesson8 for循環 For …

【C++初階學習】第十二彈——stack和queue的介紹和使用

C語言棧&#xff1a;數據結構——棧(C語言版)-CSDN博客 C語言隊列&#xff1a;數據結構——隊列&#xff08;C語言版&#xff09;-CSDN博客 前言&#xff1a; 在之前學習C語言的時候&#xff0c;我們已經學習過棧與隊列&#xff0c;并學習過如何使用C語言來實現棧與隊列&…