大家好,我是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)
今天的分享就到這里啦,歡迎大家提問和探討!
PPT:PPT
感謝大家觀看
今天的分享就到這里啦,歡迎大家點(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)注明出處。