SPRINGAOP思想及用法快速入門。

大家好,我是IT修真院深圳分院第5期學(xué)員,一枚正直善良的JAVA程序員。

今天給大家分享一下,修真院官網(wǎng)JAVA任務(wù)3中,SPRINGAOP思想及用法快速入門

一、背景介紹

1、什么是AOP

AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。 AOP是OOP的延續(xù),是軟件開發(fā)中的一個(gè)熱點(diǎn),也是Spring框架中的核心內(nèi)容之一。 利用AOP可以對(duì)業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行隔離,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時(shí)提高了開發(fā)的效率。

2、AOP與OOP

AOP可以說是OOP(面向?qū)ο缶幊蹋┑难a(bǔ)充和完善。OOP引入封裝、繼承、多態(tài)等概念來建立一種對(duì)象層次結(jié)構(gòu),用于模擬公共行為的一個(gè)集合。 不過OOP允許開發(fā)者定義縱向的關(guān)系,但并不適合定義橫向的關(guān)系,例如日志功能。 日志代碼往往橫向地散布在所有對(duì)象層次中,而與它對(duì)應(yīng)的對(duì)象的核心功能毫無關(guān)系。對(duì)于其他類型的代碼,如安全性、異常處理和透明的持續(xù)性也都是如此,這種散布在各處的無關(guān)的代碼被稱為橫切(cross cutting)。在OOP設(shè)計(jì)中,它導(dǎo)致了大量代碼的重復(fù),而不利于各個(gè)模塊的重用。

3、我對(duì)于AOP思想的理解

AOP的核心思想是幫助我們?cè)跀U(kuò)展功能(方法)時(shí)可以不依靠修改源代碼來實(shí)現(xiàn)。其采取橫向抽取機(jī)制,規(guī)避了傳統(tǒng)面向?qū)ο笾锌v向繼承體系的重復(fù)性高耦合代碼



二、知識(shí)剖析

1、為什么要使用aop

a.為了方便,用了aop能讓你少寫很多代碼

b.為了更清晰的邏輯,可以讓你的業(yè)務(wù)邏輯去關(guān)注自己本身的業(yè)務(wù),而不去想一些其他的事情,這些其他的事情包括:安全,事物,日志等。

c.為了降低之前傳統(tǒng)面向?qū)ο笾胁捎每v向繼承體系增強(qiáng)方法導(dǎo)致的耦合度過高的問題

d.提高了代碼的復(fù)用性

2、淺析AOP思想的發(fā)展及原理

發(fā)展:修改源代碼————采用OOP縱向繼承體系————采用AOP橫向織入

實(shí)現(xiàn)原理:通過動(dòng)態(tài)代理創(chuàng)建代理對(duì)象來實(shí)現(xiàn)

3、對(duì)aop專業(yè)術(shù)語的個(gè)人理解

1.通知(Advice)*:理解為增強(qiáng)更合適,里面就是增強(qiáng)方法的邏輯,分為前置增強(qiáng),后置增強(qiáng),環(huán)繞增強(qiáng),最終增強(qiáng),異常增強(qiáng)

2.連接點(diǎn)(JoinPoint):在springAOP中就是目標(biāo)類中允許你使用增強(qiáng)邏輯的所有方法。

3.切入點(diǎn)(Pointcut)*:實(shí)際被我們?cè)鰪?qiáng)的方法稱為切點(diǎn)

4.切面(Aspect)*:把增強(qiáng)應(yīng)用到切點(diǎn)上的過程

5.目標(biāo)(target):被增強(qiáng)的方法所在的那個(gè)類,也就是真正的業(yè)務(wù)邏輯,他可以在毫不知情的情況下,被織入切面。而自己專注于業(yè)務(wù)本身的邏輯。

6.代理(proxy):目標(biāo)類被增強(qiáng)后產(chǎn)生的代理類

7.織入(weaving):把增強(qiáng)應(yīng)用到目標(biāo)類的過程



三、常見問題

提問一:如何實(shí)現(xiàn)spring的AOP操作?

提問二:在確定好需要增強(qiáng)的方法之后,切入點(diǎn)的定位是如何完成的?



4.解決方案

回答一:在sring里面進(jìn)行aop操作,使用aspectJ來實(shí)現(xiàn)。aspectJ本身是一個(gè)單獨(dú)的面向切面的框架,里面定義了AOP語法,不是spring的一部分,和spring協(xié)同完成springAOP的操作,使用aspectJ來實(shí)現(xiàn)springAOP的操作有兩種方式

1.基于aspectJ的xml文件

2.基于aspectJ注解

回答二:使用表達(dá)式來配置切入點(diǎn),表達(dá)式有很多種,但是絕大多數(shù)問題都可以用execution表達(dá)式來解決

1.execution(* com.ptt.aop.Book.add(..))

2.execution(* com.ptt.aop.Book.*(..))

3.execution(* *.*(..))

4.匹配所有save開頭的方法:execution(* save*(..))



五、編碼實(shí)戰(zhàn)




六、擴(kuò)展思考

基于注解與基于配置文件的優(yōu)缺點(diǎn)

1、注解可以充分利用 Java 的反射機(jī)制獲取類結(jié)構(gòu)信息,這些信息可以有效減少配置的工作,注釋和 Java 代碼位于一個(gè)文件中,而XML 配置采用獨(dú)立的配置文件,大多數(shù)配置信息在程序開發(fā)完成后都不會(huì)調(diào)整,如果配置信息和 Java 代碼放在一起,有助于增強(qiáng)程序的內(nèi)聚性。而采用獨(dú)立的 XML 配置文件,程序員在編寫一個(gè)功能時(shí),往往需要在程序文件和配置文件中不停切換,這種思維上的不連貫會(huì)降低開發(fā)效率。

2、個(gè)人認(rèn)為如果開發(fā)的程序比較復(fù)雜的話還是多用xml配置,這樣以后方便維護(hù),反之則使用注解



七、參考文獻(xiàn)

1.常雷雷的PPT

2.CSDN博客:https://www.cnblogs.com/hongwz/p/5764917.html

八、更多討論

Q1、jp.getSignnature.getname()是啥

答:是一個(gè)可以調(diào)用被切方法名的方法

Q2、后置通知和最終通知都是在方法之后運(yùn)行,那他們?cè)谑褂蒙嫌惺裁磪^(qū)別呢

答:最終通知類似于異常機(jī)制中的finally,在核心業(yè)務(wù)邏輯運(yùn)行出現(xiàn)問題程序停止的時(shí)候依然可以被調(diào)用

Q3、在注解配置里,是如何定位到切點(diǎn)的?

答:execution表達(dá)式可以定位切點(diǎn)

今天的分享就到這里啦,歡迎大家提問和探討!

小課堂視頻

PPTPPT

感謝大家觀看

今天的分享就到這里啦,歡迎大家點(diǎn)贊、轉(zhuǎn)發(fā)、留言、拍磚~

技能樹.IT修真院

“我們相信人人都可以成為一個(gè)工程師,現(xiàn)在開始,找個(gè)師兄,帶你入門,掌控自己學(xué)習(xí)的節(jié)奏,學(xué)習(xí)的路上不再迷?!薄?/p>

這里是技能樹.IT修真院,成千上萬的師兄在這里找到了自己的學(xué)習(xí)路線,學(xué)習(xí)透明化,成長可見化,師兄1對(duì)1免費(fèi)指導(dǎo)??靵砼c我一起學(xué)習(xí)吧~

作者:東

鏈接:http://www.itdecent.cn/p/bd5b0a2938f9

來源:簡書

著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容