1. 程式人生 > >動態代理之投鞭斷流!看一下MyBatis的底層實現原理!

動態代理之投鞭斷流!看一下MyBatis的底層實現原理!

640

作者 l 祖大俊

來源:https://my.oschina.net/zudajun

一日小區漫步,我問朋友:Mybatis中宣告一個interface介面,沒有編寫任何實現類,Mybatis就能返回介面例項,並呼叫介面方法返回資料庫資料,你知道為什麼不?朋友很是詫異:是啊,我也很納悶,我們領導告訴我們按照這個模式編寫就好了,我同事也感覺很奇怪,雖然我不知道具體是怎麼實現的,但我覺得肯定是……(此處略去若干的漫天猜想),但是也不對啊,難道是……(再次略去若干似懂非懂)。

這激發了我寫本篇文章的衝動。

動態代理的功能:通過攔截器方法回撥,對目標target方法進行增強。

言外之意就是為了增強目標target方法。上面這句話沒錯,但也不要認為它就是真理,殊不知,動態代理還有

投鞭斷流的霸權,連目標target都不要的科幻模式。

注:本文預設認為,讀者對動態代理的原理是理解的,如果不明白target的含義,難以看懂本篇文章,建議先理解動態代理。

一、自定義JDK動態代理之投鞭斷流實現自動對映器Mapper

首先定義一個pojo

640

再定義一個介面UserMapper.java

640

接下來我們看看如何使用動態代理之投鞭斷流,實現例項化介面並呼叫介面方法返回資料的。

自定義一個InvocationHandler。

640

上面程式碼中的target,在執行Object.java內的方法時,target被指向了this,target已經變成了傀儡、象徵、佔位符。在投鞭斷流式的攔截時,已經沒有了target。

寫一個測試程式碼:

640

output:

640

這便是Mybatis自動對映器Mapper的底層實現原理。

可能有讀者不禁要問:你怎麼把程式碼寫的像初學者寫的一樣?沒有結構,且缺乏美感。

必須宣告,作為一名經驗老道的高手,能把程式寫的像初學者寫的一樣,那必定是高手中的高手。這樣可以讓初學者感覺到親切,舒服,符合自己的Style,讓他們或她們,感覺到大牛寫的程式碼也不過如此,自己甚至寫的比這些大牛寫的還要好,從此自信滿滿,熱情高漲,認為與大牛之間的差距,僅剩下三分鐘。

二、Mybatis自動對映器Mapper的原始碼分析

首先編寫一個測試類:

640

Mapper長這個樣子:

640

org.apache.ibatis.binding.MapperProxy.java部分原始碼。

640

org.apache.ibatis.binding.MapperProxyFactory.java部分原始碼。

640

這便是Mybatis使用動態代理之投鞭斷流。

三、介面Mapper內的方法能過載(overLoad)嗎?(重要)

類似下面:

640

Answer:不能。

原因:在投鞭斷流時,Mybatis使用package+Mapper+method全限名作為key,去xml內尋找唯一sql來執行的。類似:key=x.y.UserMapper.getUserById,那麼,過載方法時將導致矛盾。對於Mapper介面,Mybatis禁止方法過載(overLoad)。

好訊息!好訊息!Java後端技術知識星球已正式開始運營!,有興趣的小夥伴瞭解一下!現在還有優惠哦!

640

640

相關推薦

動態代理投鞭斷流一下MyBatis底層實現原理

作者 l 祖大俊來源:https://my.oschina.net/zudajun一日小區漫步,

錢寶網真的資不抵債? 非也 一下真實的錢寶資產

無人機 收購 印象 運營 gpo 企業 江蘇 一點 但是 1.裕廊騰飛產業園建築面積5.2萬平方米,主要以出租創造收益,比如租戶有中南建設,世界500強美國福派克,北京同仁堂,花王園藝等眾多品牌企業!( 估值8.5億元 ) 裕廊騰飛產業園 ? ? 2.皇家冊園,錢寶擁有1

Java動態代理通俗理解

java動態代理代理模式介紹 代理模式是一種常用的設計模式,其作用就是為目標對象提供額外的訪問方式,在不修改目標對象的前提下,擴展目標對象的額外功能,比如統計執行時間,打印日誌等。 代理模式分為兩種:靜態代理和動態代理。 需求:假如不想改動原有代碼情況下,並記錄用戶保存方法的執行時間。示例代碼如下: 接口 p

UI設計師晉升路,懂的都是精英

用戶 視覺 能夠 new 基礎 以及 常熟 你會 項目 UI設計師(http://www.sz-sztl.com/news/)的晉升分為四個階段:初級UI設計師、中級UI設計師、高級UI設計師、設計總監,在這裏分享一下設計師每個階段都需要掌握的一些技能。 初級

cglib動態代理原理說明

修飾 cep 攔截器 per 創建子類 通過 回調 詳細 call cglib采用了非常底層的字節碼技術,通過目標類的字節碼,為目標類創建子類,並在子類中用方法攔截技術,攔截所有父類方法的調用,並對攔截方法進行增強。 1)底層采用字節碼框架ASM,來轉換字節碼來生成新的類。

java動態代理CGLIB實現

ssl return 其他 ase ger pac 父類 linked nic 動態代理(CGlib 與連接池的案例) Cglib代理: 針對類來實現代理,對指定目標 產生一個子類 通過方法攔截技術攔截所有父類方法的調用。 我們要使用cglib代理必須引入 cglib的j

JDK動態代理原始碼分析

一、代理模式是什麼? 代理模式就是給一個物件提供一個代理物件,並由代理物件管理著被代理物件的引用。就像生活中的代理律師,你只需要找好代理律師,剩下的都交給代理律師來打理。 Spring MVC 有兩大特性,IoC 和 AOP。IoC為控制反轉,這裡不做介紹;AOP(Aspect Orient

動態代理實現(父子)

1、深夜奏對 已經快三更天了, Java帝國的國王還在看著IO大臣的奏章發呆,他有點想不明白, 帝國已經給臣民了提供了這麼多的東西,他們為什麼還不滿意呢? 集合、IO、反射、網路、執行緒、泛型、JDBC ......在IT界哪一個不都是響噹噹的硬通貨?  有了這些技術,寫個Java程式多

Java動態代理JDK實現和CGlib實現

     原文地址:http://www.cnblogs.com/ygj0930/p/6542259.html       一:代理模式(靜態代理)    &nbs

動態代理

使用cglib實現動態代理 在上篇部落格java動態代理中我對java的動態代理進行了講解,但是我也說過,java的動態代理有一種缺點,那就是業務類必須要有介面,但是在實際情況中我們要橫切的業務類並不一定有介面,這個時候java的動態代理自然就不能使用了,為了解

Spring AOP動態代理JDK代理

前言 我們都知道AOP中的代理就是由AOP框架動態生成的一個物件,該物件可以作為目標物件使用。此處講解Spring中的AOP代理之JDK動態代理。 JDK代理是什麼 JDK動態代理是通過java.lang.reflect.Proxy類來實現的,我們可以呼叫Pr

【轉載】Java動態代理JDK實現和CGlib實現(簡單易懂)

      原文地址:http://www.cnblogs.com/ygj0930/p/6542259.html       一:代理模式(靜態代理)           代理模式是常用設計模式的一種,我們在軟體設計時常用的代理一般是指靜態代理,也就是在程式碼中顯式指定的

動態代理繼承(兄弟)

前言:本文為《Java帝國之動態代理》的姊妹篇, 講述動態代理的另外一種實現即CGLib的設計過程。 當IO大臣絞盡腦汁地在府中設計Java動態代理的時候,他並不知道,在帝國的一個小小的部落,一個年輕的小夥子正在為同樣的問題而苦惱。 師傅剛剛給小夥子下達了任務:在執行時對一個類進行

Java動態代理JDK實現和CGlib實現(簡單易懂)

原文地址:http://www.cnblogs.com/ygj0930/p/6542259.html 一:代理模式(靜態代理)           代理模式是常用設計模式的一種,我們在軟體設計時常用的代理一般是指靜態代理,也就是在程式碼中顯式指定的代理。      

理解Java 動態代理和AOP(可以自己動手寫AOP框架

說到AOP,很容易就想到 spring AOP。因為它是AOP裡最優秀的實現框架。但本文不打算討論 spring AOP,只想把如何通過動態代理方式實現AOP思想說通。當然,整明白了這個道理,理解 spring AOP 也就簡單了! 首先我覺得需特別強調一下什麼是面向介面程

java類載入及動態代理位元組碼插莊技術

本文介紹一下,當下比較基礎但是使用場景卻很多的一種技術,稍微偏底層點,就是位元組碼插莊技術了...,如果之前大家熟悉了asm,cglib以及javassit等技術,那麼下面說的就很簡單了...,因為下面要說的功能就是基於javassit實現的,接下來先從javaagent的原

Java併發機制的底層實現原理volatile應用,初學者誤

  volatile的介紹:   Java程式碼在編譯後會變成Java位元組碼,位元組碼被類載入器載入到JVM裡,JVM執行位元組碼,最終需要轉化為彙編指令在CPU上執行,Java中所使用的併發機制依賴於JVM的實現和CPU的指令。本章我們將深入底層一起探索下Java併發機制的底層實現原理。  在多執行緒

動態代理 JDK 動態代理

動態代理 動態代理源於設計模式中的代理模式,代理模式的主要作用就是使代理物件完成使用者的請求,遮蔽使用者對真實物件的訪問。通過代理物件去訪問目標物件來控制原物件的訪問。 代理模式的最典型的應用就是 Spring AOP。 靜態代理 代理模式的實現有兩種,靜態代理和動態代理,靜態代理的代理類是需要程式設計師去寫

AOP底層實現原理動態代理如何動態

需求 原理 靜態代理 朋友 hand 自己 依賴 開發 ava 代理 指定另外一個主體代替原來的某個主體去執行某個事物 代理執行的人 需要代理的人 需要代理的事情是一定要做的 但是被代理的人沒有時間或自己做的不專業 靜態代理: 父母朋友幫忙物色找對象 代理人掌握需求,專

動態規劃揹包問題和區間模型--Java實現

揹包問題描述:給定n個重量為w1,w2...wn、價值為v1,v2...vn的物品和一個承重量為W的揹包,求這些物品中最優價值的一個子集,並且要能夠裝到揹包中。 結論:1.在不包括第i個物品的子集中,最優子集的價值是Value[i-1][j]. 2.在包括第i個物品的子