什麼是aopjava
AOP(Aspect-OrientedProgramming,面向方面編程),能夠說是OOP(Object-Oriented Programing,面向對象編程)的補充和完善。OOP容許你定義從上到下的關係,但並不適合定義從左到右的關係。例如日誌功能。日誌代碼每每水平地散佈在全部對象層次中,而與它所散佈到的對象的核心功能毫無關係。這種散佈在各處的無關的代碼被稱爲橫切(cross-cutting)代碼,在OOP設計中,它致使了大量代碼的重複,而不利於各個模塊的重用。程序員
而AOP技術則偏偏相反,它利用一種稱爲「橫切」的技術,剖解開封裝的對象內部,並將那些影響了多個類的公共行爲封裝到一個可重用模塊,並將其名爲「Aspect」,即方面。所謂「方面」,簡單地說,就是將那些與業務無關,卻爲業務模塊所共同調用的邏輯或責任封裝起來,便於減小系統的重複代碼,下降模塊間的耦合度,並有利於將來的可操做性和可維護性。web
aop使用場景spring
aop框架種類編程
使用aop能夠作的事情有不少。緩存
觀察一下傳統編碼方式與使用aop的區別 微信
核心概念mvc
描述AOP經常使用的一些術語有通知(Adivce)、切點(Pointcut)、鏈接點(Join point)、切面(Aspect)、引入(Introduction)、織入(Weaving)、通知(Advice)等。app
簡單例子框架
相比xml配置,基於註解的方式更加簡潔方便。
@Aspect public class TransactionDemo { @Pointcut(value="execution(* com.yangxin.core.service.*.*.*(..))") public void point(){ } @Before(value="point()") public void before(){ System.out.println("transaction begin"); } @AfterReturning(value = "point()") public void after(){ System.out.println("transaction commit"); } @Around("point()") public void around(ProceedingJoinPoint joinPoint) throws Throwable{ System.out.println("transaction begin"); joinPoint.proceed(); System.out.println("transaction commit"); } }
在applicationContext.xml中配置。
<aop:aspectj-autoproxy /> <bean id = "transactionDemo" class = "com.yangxin.core.transaction.TransactionDemo" />
spring aop原理
經過前面介紹能夠知道:AOP 代理實際上是由 AOP 框架動態生成的一個對象,該對象可做爲目標對象使用。AOP 代理包含了目標對象的所有方法,但 AOP 代理中的方法與目標對象的方法存在差別:AOP 方法在特定切入點添加了加強處理,並回調了目標對象的方法。
Spring 的 AOP 代理由 Spring 的 IoC 容器負責生成、管理,其依賴關係也由 IoC 容器負責管理。所以,AOP 代理能夠直接使用容器中的其餘 Bean 實例做爲目標,這種關係可由 IoC 容器的依賴注入提供。
aop開發時,其中須要程序員參與的只有 3 個部分:
爲了理清關係,先來個類關係圖。
兩種動態代理方式
Spring默認採起的動態代理機制實現AOP,當動態代理不可用時(代理類無接口)會使用CGlib機制。
Spring提供了兩種方式來生成代理對象: JDKProxy和Cglib,具體使用哪一種方式生成由AopProxyFactory根據AdvisedSupport對象的配置來決定。默認的策略是若是目標類是接口,則使用JDK動態代理技術,不然使用Cglib來生成代理。
JDK動態代理
JDK動態代理主要涉及到java.lang.reflect包中的兩個類:Proxy和InvocationHandler。InvocationHandler是一個接口,經過實現該接口定義橫切邏輯,並經過反射機制調用目標類的代碼,動態將橫切邏輯和業務邏輯編制在一塊兒。
Proxy利用InvocationHandler動態建立一個符合某一接口的實例,生成目標類的代理對象。
CGLib動態代理
知識拓展
經過上面的分析,你們是否有種熟悉的感受,彷佛和攔截器、過濾器的功能類似。那麼問題來了,aop與攔截器、過濾器是什麼關係。
先來回顧一下攔截器與過濾器。以下圖一網友的測試,在web.xml中註冊了TestFilter1和TestFilter2。而後在spring的配置文件中配置了BaseInterceptor和TestInterceptor。獲得的結果以下圖所示。從圖中能夠看出,攔截器和過濾器都橫切了業務方法,看似符合aop的思想。
Filter過濾器:攔截web訪問url地址。 Interceptor攔截器:攔截以 .action結尾的url,攔截Action的訪問。 Spring AOP攔截器:只能攔截Spring管理Bean的訪問(業務層Service)
寫在最後
下篇文章將會寫Spring cache的內容,一樣以思惟導圖的方式編寫。可視化學習,讓java再也不難懂。
最後的最後,歡迎關注個人微信公衆號java思惟導圖,下載導圖源文件,以及更多java思惟導圖與項目資料供你學習,帶你走進記憶腦圖的世界。
關注公衆號並回復「思惟導圖」當即下載源xmind導圖。
上篇文章閱讀