aop技术概述
手寫Spring框架今天主要是去寫一個Spring事務框架,我要我們自己寫一個,主要是知道Spring底層事務的實現原理,我們現在進入源碼分析階段,會講到哪些內容,我明天會把這個圖完善的比較好的,你們如果到了今后的時候,我們分析到哪些原理呢,我們現在已經到了源碼分析階段,首先我們會講到Spring的事務的原理分析,我們講事務原理分析的時候,沒有帶大家看源碼,因為看源碼是比較繞的過程,所以改成手寫Spring事務,何況你去看源碼,然后第二個還有一個比較核心的知識,就是Spring的IOC,我們會講手寫IOC,然后還有一個比較重要的知識,有沒有人知道SpringMVC,其實在SpringMVC里面,問的比較多的一個知識,就是SpringMVC的執行流程,不知道你們有沒有聽說過,執行流程,我會帶著大家手寫SpringMVC的執行流程,記住是手寫的,手寫的基本功能,然后在這個時候我會給大家總結一下,基本核心源碼API,什么工廠bean,我會給你們詳細講到,還有會講到bean的生命周期,這是我講Spring核心的源碼,你們只要把事務搞懂了之后,你都不會怕問事務的原理是什么,因為你們都手寫出來了,這一周講的都是源碼這一塊的,Spring講完了之后,我們會手寫一個ORM框架,講一下Mybatis一些簡單的功能,手寫ArrayList,手寫Set集合,手寫HashMap集合,我在這邊會首先這三個集合,只要把這三個集合搞懂,我可能寫源碼的時候沒有講太多別人怎么寫的,可能都是根據自己的思路去寫的,可能和真的源碼有點差別,不能按照別人的思路去做,我覺得我有我自己的思路,萬一比JVM寫的更好呢,我們可能都是手寫的,在這邊我們講一下什么,為什么要講手寫ArrayList,再講手寫Set,你只要把這兩個講清楚的情況下,再講手寫HashMap,那很容易的,你只要把前面兩個搞會了,講熟悉HashMap,非常非常容易的,可能HashMap是最難的,他需要整合到ArrayList的一些原理,Set里的一些原理整合在一起,所以這里你們會用到鏈表技術,如果我把手寫HashMap講完了之后,你們記不記得有一個沒有講的,Lock,就是Lock集合,底層是使用AQS進行包裝的,為什么今天不講呢,底層通過雙向鏈表,我們專門把鏈表講完之后,這個時候你就會知道Lock鎖底層是使用AQS包裝起來的,有人問有沒有手寫TOMCAT,我們把分布式微服務講完后,NIO,netty框架,講完這兩個框架之后,我們再講手寫TOMCAT,因為會用到NIO和netty框架,有個技術整合起來,其實手寫TOMCAT并沒有你們想的那么難,你們只要記住一點,基于請求和響應,你們只要把請求的類和響應的類,如果你能把它寫出來,基本的TOMCAT你都能使用的,你們不要覺得TOMCAT特別難,你們如果想寫的特別好的情況下,絕對不是你一個人能夠寫的出來的,因為它組件比較多,可以手寫,沒有你們想的那么難,最簡單的一種,手寫Spring事務,原理是什么,因為這個能聽懂的情況下
?
你們有沒有人對Spring事務有深入了解過的,事務底層是怎么去封裝起來的,怎么去進行實現的,這個你們有有沒誰知道的,事務的整個底層實現原理,動態代理,從最基礎的去講原理,你們可能學過Spring的事務原理,是基于什么實現的,是基于AOP進行實現的,在這里你們要知道,AOP里面可能有一些特性,環繞通知,異常通知,前置通知,后置通知,AOP環繞通知和異常通知,實現Spring的事務,那我跟你講一下,你待會會知道,我為什么把這個話說出來,因為我們待會手寫,你們現在不懂沒關系,大致知道概念就行了,Spring他的事務是基于AOP的環繞通知和異常通知實現的,有些人會想到,環繞是干嘛用的,不懂沒關系,因為我會從基礎給你們轉變到深入里面去的,然后在這里講一下,在Spring事務里面,分為兩種,那兩種呢,一種叫做編程式的事務,然后第二種叫做聲明式的事務,有的地方進行什么叫法,這是我們要給你們說一下的,有的地方吧AOP的原理是這樣表達的,我覺得這樣描述也是非常準的,就是Spring的底層事務底層使用什么呢,使用編程事務進行包裝的,這個包裝的話就會采用到什么呢,AOP技術,就是這樣的,所以你們現在還不知道編程式事務是干嘛用的,編程式事務就是手動begin,手動commit,手動去rollback,做回滾這個,其實底層是通過編程事務加上AOP技術包裝出來的,最后等于聲明式事務,聲明式事務有注解版本的,我們今天是使用編程式事務去實現事務原理,我們會實現注解版事務底層實現原理,直接實現他一個類似的功能,我會在這里講一些概念,你們就根據我的概念去想就行了,我們首先打開一個畫圖,我們在講Spring的時候,你們說一下Spring里面有幾個比較核心的技術,你們誰能夠說一下,核心技術有幾個,誰能夠說一下的,依賴注入,AOP,IOC,DI,那么核心就是IOC和AOP,那么核心就這兩個,IOC和AOP,這個可能是必問的,這個時候大家可以注意一下,我們今天將AOP,問一下你們,什么是AOP,什么是AOP技術,AOP技術應用的一個場景,為什么要用AOP技術,首先有人想到了,AOP技術是面向切面編程,這是很多人初學的時候,都不知道AOP到底干嘛用的,我告訴你們以后你們真正做開發的時候,這個AOP技術其實用的非常非常多的,為什么說用的非常多呢,我們就說簡單點,有什么目的呢,解決代碼復用的問題,可能有人不理解,他為什么能夠解決代碼復用的問題,有這種疑問,我相信很多同學都用過Spring的,你不用說的那么繞,我們公司里面為什么用到AOP技術呢,就是因為它可以解決代碼復用問題,你們只要能把復用問題答出來就行了,這個時候我給你們說一下,比如我們來舉個例子,你們現在可以去思考一下,比如我們現在實現一個WEB項目,在web項目中每個請求都需要打印日志,你們說下怎么辦,我只要客戶端和服務端請求的時候,你們應該怎么解決,怎么去解決,想一想,比如我們現在的web請求日志里面,每個請求都需要打印日志,假如我現在有幾千個請求,幾萬個請求,那你覺得該怎么辦,其實我告訴你們,你們會在后面用到了,你們在做企業項目的時候你們就會知道,像我們的企業的項目日志是怎么處理的呢,不是用過濾器,過濾器攔截器確實可以做,但是不推薦使用攔截器,你們這邊可以看一下,這是我們實打實的一個微服務的電商項目,他就用到了AOP的編程的,你們可能看一下就知道,我們為什么用到AOP編程呢,你們之后會學到的,在微服務電商項目里面是怎么去處理日志的呢,你們可以看一下,它是怎么打印日志的,這其實是一個AOP編程,他其實日志是怎么打印的呢,只要依賴我這個類,依賴完了以后,這里面就會有前置通知和后置通知,在你方法之前和之后,都會攔截,然后這里我就直接通過AOP編程,給你去打印這樣的一個日志的,我就不去演示,你們以后會用到的,有的人說打印日志不是很簡單嗎,log.info("userId:" + userId),如果不去重構的話,那么我在這邊有幾千個方法,每個方法都要寫一下,那是非常丑的,非常難看的,如果你們工作之后在方法前后打印日志,都是非常low的,所以你們可以看到,在我們的企業項目里面,微服務電商里面,根本就沒有打印日志,打印日志都是通過AOP編程,在你方法之后和之前進行攔截,打印這樣的一些參數,這就是AOP編程的一個應用場景,首先AOP的應用場景的一個地方就是日志,還有一個地方叫做事務,這個事務為什么會用到AOP編程,這是為什么,你們要知道AOP編程是做什么目的,在這里我們說一下AOP編程的核心點,在方法之前或者之后處理事情,有人會說,這是什么意思啊,在方法之前或之后處理事情,這是啥意思,我可以舉個例子出來,你們學過代理設計模式沒有,有沒有了解代理設計模式,是不是相對于中介一樣的,什么意思呢,AOP底層實現原理,是代理設計模式,這就有人問,什么是代理設計模式,我給你們講講,代理設計模式,他可以攔截你的方法,在你的方法之前和之后做一個處理,我不用暴露我的真實方法,什么意思呢,在待會我會講到代理設計模式的,其實你們可以怎么去舉例子呢,假設我找范冰冰給我打廣告,正常情況下你是不能直接找到范冰冰的,你需要找到范冰冰的經紀人,我和范冰冰進行聯系之后,經紀人再和范冰冰聯系,是不是能夠讓范冰冰來做代言,目的什么意思呢,能夠隱藏真實的方法和參數,他像個中介一樣的,這樣的話我可以在之前和之后做一個處理,待會我會畫圖去講解,你們現在真不懂沒關系,我之前講過代理設計模式的,在這里給你們講一下,你們現在如果是有人在初學的時候,就不用去想,就記住一句話,AOP其實就是面向切面編程,他就是在方法之前和之后做一些事情,你就這樣理解就行了,待會會細說的,這個時候你就可以去想一下事務,事務里面會用到這樣的一個AOP編程的,這我就想給你們講一下,你回頭看見我剛才說的一句話,我剛才說的這樣一句話,Spring的事務會基于Spring的環繞通知,他在你的方法之前做了一個begin,方法執行完沒有拋異常的情況下,我就會做一個commit,如果是發生異常的情況下,拋出去的時候會走異常通知,待會會講到手寫Spring事務,怎么寫呢,大家可以看一下例子,預習一下,會慢慢的給你講到的,我會講到適用場景,叫做權限,如果我不允許你這個方法調我的方法,那我會用AOP方法進行攔截,還有哪些地方用到了AOP技術的,你們可以再想想,還有沒有,你們可以想想,絕對還有很多地方,參數驗證,這個也可以,其實我講一下,這個比較多啊,多數據源不是,它是通過包名來區分到底是屬于哪個數據源的,在這里參數驗證也是可以的,其實這種場景比較多,你只要把事務,日志,權限這三個,能把這個談出來就非常好,還有性能監控,這個其實比較好,這也是比較好的,AOP主要是這幾個點,日志記錄,性能統計,安全控制,事務處理和異常處理,這個大體的說一下,我做項目的時候,哪些地方用到AOP編程呢,就是做日志處理,反正就是應用場景比較多,但是歸根結底,你們就記住一個思想,它是給我們提高代碼復用的一個問題,記住這一點就行了,在這里我們談論前面兩點,我們為什么要用到AOP技術,首先是復用和解耦,這是最基本的,還有一個就是代碼的復用機制,反正歸根結底就是一句話,少寫代碼,反正我覺得,你們以后只要在業務邏輯上面,代碼不重復的情況下,在AOP編程里面,還有幾個名詞,不知道你們聽過沒有,第一個叫做切入點,還有第二個叫做切面,第三個我們可以叫做關注點,這個時候我問你們,關注點和切點,切面到底是一個什么意思呢,關注點是什么意思呢,你們就可以這樣理解,我很多地方都需要打印請求日志,這個點是我先做要關注一下的,因為它現在需要打印日志了,這就是我關注的點,關注點我們可以叫做重復的代碼,重復的代碼就可以把它叫做關注點,就是相同點,所以大家不要想得非常的復雜,關注點就是重復代碼,就是用來解決重復代碼的問題,那切入點是什么意思呢,我們先說切面,在說切入點,切面是什么意思,切面大家可以這樣理解,相當于關注點他形成的類,叫做關注點形成的類,可以叫做切面類,有些人可能不理解是什么意思,我大體說一下,相當于把很多重復代碼抽取出來,就相當于把重復的代碼抽取出來,抽取出來之后呢,在通過切面類的方式,去進行執行,這個我不知道你們理解不理解是什么意思,你們怎么理解,而是在切面類里面執行的,可以這樣理解,動態進行織入的,在運行的時候業務方法動態植入的,我們也可以把它叫做切面類的代碼,切入點其實很多同學比較好理解的,待會會細說,那么切入點是什么意思呢,我們就可以把它叫做執行目標的對象,哪些代碼可能會用到我們這些AOP技術,哪些方法需要被攔截,假如我想讓我的test方法打印日志請求,我們就可以認為在這個點可以切入進去,那么通過切入點的話,在這個方法之前攔截這個參數,切面類的代碼進行執行,你們現在繞的話很正常,初學AOP的時候都會覺得比較繞,代碼演示完了之后,你們就會理解的,AOP的幾個點大致的說一下 SpringAOP原理 AOP編程技術什么是AOP編程 AOP: Aspect Oriented Programming 面向切面編程。面向切面編程(也叫面向方面):Aspect Oriented Programming(AOP),是目前軟件開發中的一個熱點。 利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的 可重用性,同時提高了開發的效率。AOP是OOP的延續,是(Aspect Oriented Programming)的縮寫,意思是面向切面(方面)編程。主要的功能是:日志記錄,性能統計,安全控制,事務處理,異常處理等等。主要的意圖是:將日志記錄,性能統計,安全控制,事務處理,異常處理等代碼從業務邏輯代碼中劃分出來, 通過對這些行為的分離,我們希望可以將它們獨立到非指導業務邏輯的方法中,進而改 變這些行為的時候不影響 業務邏輯的代碼。可以通過預編譯方式和運行期動態代理實現在不修改源代碼的情況下給程序動態統一添加功能的一種技術。 AOP實際是GoF設計模式的延續,設計模式孜孜不倦追求的是調用者和被調用者之間的解耦,AOP可以說也是這種目標的一種實現。 假設把應用程序想成一個立體結構的話,OOP的利刃是縱向切入系統,把系統劃分為很多個模塊(如:用戶模塊,文章模塊等等), 而AOP的利刃是橫向切入系統,提取各個模塊可能都要重復操作的部分(如:權限檢查,日志記錄等等)。由此可見,AOP是OOP的 一個有效補充。 注意:AOP不是一種技術,實際上是編程思想。凡是符合AOP思想的技術,都可以看成是AOP的實現。Aop, aspect object programming 面向切面編程功能: 讓關注點代碼與業務代碼分離! 關注點關注點,重復代碼就叫做關注點; 切面關注點形成的類,就叫切面(類)!面向切面編程,就是指 對很多功能都有的重復的代碼抽取,再在運行的時候網業務方法上動態植入“切面類代碼”。 切入點執行目標對象方法,動態植入切面代碼。可以通過切入點表達式,指定攔截哪些類的哪些方法; 給指定的類在運行的時候植入切面類代碼。?
總結