摘要:序是的縮寫,中文翻譯是面向切面編程。首先面向切面編程這個(gè)名稱很容易讓人想起面向?qū)ο缶幊虂怼_@種動態(tài)地將代碼織入到類的指定方法指定位置上的編程思想就是面向切面編程。概念面向切面編程具體的一些概念。
序
AOP是Aspect-Oriented Programming的縮寫,中文翻譯是面向切面編程。作為Spring的特征之一,是要好好學(xué)習(xí)的。
首先面向切面編程這個(gè)名稱很容易讓人想起面向?qū)ο缶幊蹋?b>OOP)來。我們知道面向?qū)ο缶幊淌菑纳贤碌陌严到y(tǒng)拆分成若干個(gè)類,如Web項(xiàng)目中常見的Controller、Service、Dao等分層。但是面向?qū)ο缶幊虒τ趶淖蟮接业乃匠橄笫譄o力,類似于日志、權(quán)限等系統(tǒng)級功能的代碼會重復(fù)的出現(xiàn)在任何地方。簡單的說,面向切面編程是對面向?qū)ο缶幊痰囊环N補(bǔ)充,它可以把系統(tǒng)里一些分散的重復(fù)代碼集中在一起,抽象成一個(gè)切面。先來舉一個(gè)例子:
有一個(gè)內(nèi)部使用的管理系統(tǒng),Controller中的每個(gè)接口在調(diào)用時(shí)都要記錄下當(dāng)前用戶名稱、當(dāng)前時(shí)間等參數(shù)。
很明顯這個(gè)需求的實(shí)現(xiàn)代碼在每個(gè)接口中都是重復(fù)的。即使提取成公共類的公共方法,在每個(gè)接口里也都有一句該公共方法的調(diào)用,導(dǎo)致類之間的耦合。
我們希望把原來接口中的記錄代碼去除掉,使這些接口只關(guān)注自己的業(yè)務(wù)邏輯。然后使用預(yù)編譯或運(yùn)行期動態(tài)代理等方式實(shí)現(xiàn)在不修改接口代碼的情況下,為接口添加記錄功能。這種動態(tài)地將代碼織入到類的指定方法、指定位置上的編程思想就是面向切面編程。
概念面向切面編程具體的一些概念。
《EXPERT ONE ON ONE J2EE DEVELOPMENT WITHOUT EJB》第8章、《Spring實(shí)戰(zhàn)》第4章:
增強(qiáng)(advice,另譯為通知,但《Spring3.x企業(yè)應(yīng)用開發(fā)實(shí)戰(zhàn)》作者不贊成):在特定連接點(diǎn)執(zhí)行的動作。例子中的實(shí)現(xiàn)代碼就是增強(qiáng)。
切點(diǎn)(pointcut):一組連接點(diǎn)的總稱,用于指定某個(gè)增強(qiáng)應(yīng)該在何時(shí)被調(diào)用。例子中的指定哪些接口和指定位置就是切點(diǎn)。
連接點(diǎn)(join point):在應(yīng)用執(zhí)行過程中能夠插入切面的一個(gè)點(diǎn)。例子中具體的一個(gè)接口和指定位置的結(jié)合就是連接點(diǎn)。
切面(aspect):通知(即增強(qiáng))和切點(diǎn)的結(jié)合。
AOP在Spring中主要是通過動態(tài)代理實(shí)現(xiàn)的,具體實(shí)現(xiàn)也分為兩種:JDK動態(tài)代理和CGLIB動態(tài)代理。其中JDK動態(tài)代理是基于接口代理,CGLIB動態(tài)代理是基于繼承代理。
JDK動態(tài)代理作為Java自帶的一種動態(tài)代理技術(shù),JDK動態(tài)代理的優(yōu)勢是使用反射技術(shù)來生成代理類,在生成效率上比較高。缺點(diǎn)是只能基于接口來動態(tài)代理,如果目標(biāo)類沒有實(shí)現(xiàn)任何接口是不能使用JDK動態(tài)代理的。
來看一個(gè)用JDK動態(tài)代理的例子。
public class DynamicProxy implements InvocationHandler { /** * 被代理類 */ private Object target; public DynamicProxy(Object target) { this.target = target; } public static Object bind(Object target) { InvocationHandler invocationHandler = new DynamicProxy(target); return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), invocationHandler); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(method.getName() + " 方法執(zhí)行前"); //執(zhí)行被代理類方法 Object ret = method.invoke(target, args); System.out.println(method.getName() + " 方法執(zhí)行后"); return ret; } public static void main(String[] args) { Dao dao = new OrderDao(); dao.doSomeThing(); Dao daoProxy = (Dao) DynamicProxy.bind(dao); daoProxy.doSomeThing(); } }
public class OrderDao implements Dao { @Override public void doSomeThing() { System.out.println("test"); } }
public interface Dao { void doSomeThing(); }
輸出: test doSomeThing 方法執(zhí)行前 test doSomeThing 方法執(zhí)行后 Process finished with exit code 0后記
這次只是梳理下概念,把自己理解的AOP概念寫下來。也參考了很多文章,大體都是一致的細(xì)節(jié)上有些不同,把自己理解的寫出來給大家看下就知道有沒有錯(cuò)了。順便整理一下,免得以后別人問起自己支支吾吾的不知道從哪說起。并沒有去了解Spring中具體的AOP實(shí)現(xiàn),有興趣的同學(xué)可以自行深入了解下。
我的博客地址
參考資料什么是面向切面編程AOP?
好書一起讀(115):重學(xué)Spring之面向切面
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/76654.html
摘要:面向切面的本章主要內(nèi)容面向切面編程的基本原理通過創(chuàng)建切面使用注解為切面注入依賴。什么是面向切面編程切面能夠幫我們模塊化橫切關(guān)注點(diǎn)。在使用面向切面編程時(shí),我們?nèi)匀辉谝粋€(gè)地方定義通知功能,而無需修改受影響的類。切面切面是通知和切點(diǎn)的結(jié)合。 面向切面的Spring 本章主要內(nèi)容: 面向切面編程的基本原理 通過POJO創(chuàng)建切面 使用@Aspect注解 為AspectJ切面注入依賴。 說明 ...
摘要:入門篇學(xué)習(xí)總結(jié)時(shí)間年月日星期三說明本文部分內(nèi)容均來自慕課網(wǎng)。主要的功能是日志記錄,性能統(tǒng)計(jì),安全控制,事務(wù)處理,異常處理等等。 《Spring入門篇》學(xué)習(xí)總結(jié) 時(shí)間:2017年1月18日星期三說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:https://github.com/zccodere/s...個(gè)人學(xué)習(xí)源碼:https://git...
摘要:是一種特殊的增強(qiáng)切面切面由切點(diǎn)和增強(qiáng)通知組成,它既包括了橫切邏輯的定義也包括了連接點(diǎn)的定義。實(shí)際上,一個(gè)的實(shí)現(xiàn)被拆分到多個(gè)類中在中聲明切面我們知道注解很方便,但是,要想使用注解的方式使用就必須要有源碼因?yàn)槲覀円? 前言 只有光頭才能變強(qiáng) 上一篇已經(jīng)講解了Spring IOC知識點(diǎn)一網(wǎng)打盡!,這篇主要是講解Spring的AOP模塊~ 之前我已經(jīng)寫過一篇關(guān)于AOP的文章了,那篇把比較重要的知...
摘要:,,面向切面編程。,切點(diǎn),切面匹配連接點(diǎn)的點(diǎn),一般與切點(diǎn)表達(dá)式相關(guān),就是切面如何切點(diǎn)。例子中,注解就是切點(diǎn)表達(dá)式,匹配對應(yīng)的連接點(diǎn),通知,指在切面的某個(gè)特定的連接點(diǎn)上執(zhí)行的動作。,織入,將作用在的過程。因?yàn)樵创a都是英文寫的。 之前《零基礎(chǔ)帶你看Spring源碼——IOC控制反轉(zhuǎn)》詳細(xì)講了Spring容器的初始化和加載的原理,后面《你真的完全了解Java動態(tài)代理嗎?看這篇就夠了》介紹了下...
閱讀 4377·2021-09-09 09:33
閱讀 2382·2019-08-29 17:15
閱讀 2370·2019-08-29 16:21
閱讀 972·2019-08-29 15:06
閱讀 2613·2019-08-29 13:25
閱讀 578·2019-08-29 11:32
閱讀 3247·2019-08-26 11:55
閱讀 2587·2019-08-23 18:24