終于擁有屬于自己的博客了,記錄一點心得體會吧,生活的后花園,
本人大二,雙非本科在讀,很早之前就想開博客了,這種想法在去年暑假,也就是2022年的夏天尤為強烈,當時愛上了演算法,每天都要刷不少的題,雖然有的是看著大佬們的題解才拿到思路的,但慢慢積累下來也養成了不少演算法思維,打開博客對我來說真不是一件容易的事情,不知道寫什么,寫出來的東西入不了大家的眼怎么辦,單純浪費了時間怎么辦...當時啊想了很多勸自己打消開博的念頭,但直到現在,我才發現,如果能把當時記錄下來,如今的我可以說是擁有一筆不小的財富了,現在又是一次機會了,還是抓住吧,這邊就記錄一點平時的學習心得和一些感悟吧,便于自己及時總結歸納,時不時也能寫一些生活碎片,計劃是每天晚上寫一點,沒有意外的每天都會有,歡迎技術交流!
最近在學習Spring,前幾天都是混亂的,學一會歇一會,沒有很強的連貫性,現在事情都忙完了,終于有時間空下來定心學習了,前面學習中,首先了解到了Spring的優點,在開發中能做到充分解耦,簡化開發,同時提供大量的開發工具,目前學完了Spring的核心容器部分,包括有IoC(控制反轉)和DI(依賴注入),Bean的組態檔裝配和注解開發,見識尚為短淺,學無止境,虛心向前,下面來整理一下今天學到的AOP(面向切面編程),
什么是AOP?
我的理解是,AOP是將一個共同的功能抽取出來,然后分配給需要他們的方法,在不驚動原有的設計的情況下,實作功能的修改,在面向物件的編程中,我們需要為某個事務撰寫方法時,一般都會需要什么寫什么,對于完全不同的事務來說,效率很高,然而如果遇到有共性的事務時,操作就變得麻煩了起來,要對每一種事務都書寫相同的方法,即使怎么熟練ctrl+cv開發,都會被這復雜的步驟折服,而AOP則解決了這一辦法,例如在每次查找操作后記錄操作者,操作的物件,操作的時間...就可以將其單獨寫為一個方法,在AOP中,這種方法稱為通知,它將互通的代碼抽取出,在程式運行是將其分散到需要執行的地方,區別于繼承的地方在于,該程序是一種采取橫向抽取機制的方式,而繼承采取的是縱向的方式,生動點,或許可以比作一個家族,從爺爺到兒子到孫子,他們都繼承這這個家族的Y染色體,一脈相承,這就是繼承,而AOP實作的就是X染色體的發放,例如這個爺爺有3個兒子,那么無論如何,奶奶的X染色體都會發放給他們的3個兒子,這比喻應該夠生動了吧!這樣一來,AOP是什么就清楚了,要知道的是它能提高開發效率,增強代碼的可維護性(如果要修改方法,很簡單,修改通知即可),這是它成為Spring的核心思想之一的重要原因!
AOP有什么?
在大致知道AOP負什么責任之后,有必要來了解一下AOP里面有什么,
- 切面(Aspect):既然被稱為面向切面編程,切面的定義尤為重要,切面是指封裝的用于橫向插入的類,在組態檔中使用<bean>元素指定后,方可被Spring容器識別,
- 連接點(JointPoint):是指在程式執行程序中的某個階段點,
- 切入點(PointCut):是指切面和程式的交叉點,書中描述為需要處理的連接點,切入點指的是類或者方法名,例如應用通知到所有的含有select的方法中時,滿足該規則的方法都是切入點,
- 通知增強處理(Advice):AOP在特定的切入點執行增強的處理,在定義好切入點的地方所要執行的代碼,可以理解為切面類中的方法,
- 目標物件(Target Object):指所有被通知到的物件,他們有被增強的功能可以實作!(AOP核心概念)
- 代理(Proxy):將通知應用到目標物件后,被動態創建的物件,(AOP核心概念)
- 織入(Weaving):將切面代碼插入到目標物件上,從而生產代理物件的程序,
AOP的作業流程是什么?
- Spring容器的啟動
- 讀取所有切面配置中的切入點
- 初始化bean,判定bean對應的類中的方法是否匹配到任意的切入點
匹配失敗則創建一個新物件
匹配成功,則創建原始物件(目標物件)的代理物件(織入)
- 獲取bean執行方法
獲取bean,呼叫方法并執行,完成操作,
獲取的bean是代理物件時,根據代理物件的運行模式運行原始方法與增強的內容,便完成了操作
Spring中AOP的本質是什么:代理模式
在main函式中運行如下代碼(AOP配置已完成),查看此時目標物件的class,
ApplicationContext ctx=new AnnotationConfigApplicationContext(SpringConfig.class);
BookDao bookDao= ctx.getBean(BookDao.class);
bookDao.update();
System.out.println(bookDao);
System.out.println(bookDao.getClass());

在main函式中運行如下代碼(AOP配置已完成),查看此時目標物件的class,可以發現最終用的是代理物件,(在AOP中對最終的物件的toString方法進行了重寫,所以會看到第三行的內容),
AOP切入點運算式
切入點:要增強的方法
切入點運算式:要增強的方法的描述方式
描述方式一:執行xx包下的xx介面中的無引數方法
描述方式二:執行xx.impl包下的xx類中的無引數方法
格式:動作關鍵詞(訪問修飾符號 回傳值 包名.類/介面.方法名(引數)例外名)


書接上文(已經是第二天了)
本來昨天想著寫一點發出去的,沒想到就點了個保存草稿,想著一覺醒來會不會暴漲幾個閱讀來著,呵呵,還是不熟悉啊,在寫總結前先記錄一下今天的軼事,,寫代碼練練的時候,發現在Test中自動裝配莫名報錯了,網上翻遍了資料,對照原版一個個看,愣是看了十幾分鐘沒看出來哪邊錯了,后來想著自動裝配得先有Bean啊,讓CompententScan掃一下我的Service包不就好了,納尼?不存在?原來如此,在寫包的時候居然把Service包寫到主包外面去了,罪過罪過,,,


昨天說到AOP的切入點運算式,其中通配符的使用可以說是多種多樣,可以應對不同的開發需求,今天進一步深入學習AOP,
AOP的通知型別
- 前置通知:在原始方法執行前,注解為@Before
- 后置通知:在原始方法執行后,注解為@After
- 環繞通知:環繞通知最為重要,在原始方法運行前后都會執行,注解為@Around,環繞通知要依賴形參ProceedingJoinPoint才能對原始方法進行呼叫(同時它也只能位于形參的第一位),正因為如此,也可隔離原始方法的呼叫,如果需要回傳值,則可以通過設定一個Object物件來接受回傳值,同時也能對原始方法中拋出的例外進行處理,
- 回傳后通知:在原始方法運行完畢后執行
- 拋出例外后通知:在原始方法拋出例外后執行
獲取通知中的資料
- 獲取切入點方法的引數:獲取切入點方法的回傳值:①在回傳后通知②使用環繞通知
- JoinPoint:適用于前置,后置,回傳后和拋出例外后通知
- ProceedJoinPoint:適用于環繞通知
- 獲取切入點方法的回傳值:①在回傳后通知②使用環繞通知
- 獲取切入點方法運行例外:①拋出例外后通知②環繞通知
由此可見環繞通知是有多么重要!
那么關于AOP的學習到這里差不多就結束了,所學甚淺,還望看管海涵,有錯誤還請斧正,明天見啦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/543039.html
標籤:Java
