這篇文章主要介紹“什么是Spring AOP”,在日常操作中,相信很多人在什么是Spring AOP問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”什么是Spring AOP”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
10年積累的成都做網(wǎng)站、網(wǎng)站設計經(jīng)驗,可以快速應對客戶對網(wǎng)站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡服務。我雖然不認識你,你也不認識我。但先網(wǎng)站制作后付款的網(wǎng)站建設流程,更有榆社免費網(wǎng)站建設讓你可以放心的選擇與我們合作。

AOP是aspect-oriented programming的縮寫,譯為面向切面編程。利用 AOP 可以對業(yè)務邏輯的各個部分進行隔離,從而使得 業(yè)務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發(fā)的效率。簡單來說,AOP就是不修改源代碼在主干功能里面添加新功能。
AOP底層使用了動態(tài)代理:在有接口的時候使用JDK 動態(tài)代理、在沒有接口的時候使用CGLIB字節(jié)碼動態(tài)代理。
簡介
使用JDK 動態(tài)代理需要用到JDK中的Proxy類里面的newProxyInstance方法創(chuàng)建代理對象。方法如下:
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h);
newProxyInstance方法的三個參數(shù)說明:
loader 定義代理類的類加載器
interfaces 代理類要實現(xiàn)的接口列表(可以多個)
h 指派方法調(diào)用的處理程序(要增強的功能在這里面實現(xiàn))
newProxyInstance方法返回一個指定接口的代理類實例。
InvocationHandler接口中有個invoke方法,用于實現(xiàn)增強的功能:
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;
invoke方法的三個參數(shù)說明:
proxy表示代理對象
method表示被增強的方法
args是方法的參數(shù) 若沒有則為null
示例代碼
代碼結(jié)構(gòu)如下:
└─src
└─com
└─spring5
JDKProxy.java
UserDao.java
UserDaoImpl.java
UserDao接口:
public interface UserDao {
int add(int a,int b);
String update(String id);
}
UserDaoImpl類:

JDKProxy類:

運行結(jié)果:
方法之前執(zhí)行…add :傳遞的參數(shù)…[1, 2]
I am add…
方法之后執(zhí)行…com.spring5.UserDaoImpl@355da254
result:3
簡介
使用CGLIB字節(jié)碼動態(tài)代理不受代理類必須實現(xiàn)接口的限制,其底層采用ASM字節(jié)碼生成框架。CGLIB動態(tài)代理的優(yōu)缺點:
使用字節(jié)碼技術生產(chǎn)代理類比JAVA反射效率高
不能對聲明為final的方法進行代理,因為其原理是動態(tài)生成被代理類的子類
需要實現(xiàn)接口MethodInterceptor,然后重寫intercept方法:
Object intercept(Object proxy, Method method, Object[] args, MethodProxy arg3) throws Throwable;
intercept方法的參數(shù)說明:
proxy CGLIB生成的代理類實例,也是目標對象的子類,相當于重寫父類方法
method 被代理方法
args 方法參數(shù)
為生成的代理類對方法的代理引用
intercept方法返回
另外用到了Enhancer類,它是Cglib中的一個字節(jié)碼增強器,先調(diào)它的setSuperclass()將被代理類設置成父類、再調(diào)setCallback函數(shù)執(zhí)行intercept方法,最后調(diào)create()生成代理類。
示例代碼
代碼結(jié)構(gòu)如下:
└─src
└─com
└─spring5
CglibProxy.java
User.java
User類:
public class User {
public void sleep() {
System.out.println("我想睡覺...");
}
}
CglibProxy類:

運行結(jié)果:
睡覺前脫衣服
我想睡覺…
起床穿衣服
概述
AOP相關的幾個術語:
連接點
類里面哪些方法可以被增強,這些方法稱為連接點
切入點
實際被真正增強的方法稱為切入點
通知
實際增強的邏輯部分稱為通知,分為前置通知、后置通知、環(huán)繞通知、異常通知和最終通知五種類型,其中最終通知相當于JAVA的finally。
切面
把通知應用到切入點過程
AspectJ不是 Spring 組成部分,是一個獨立的AOP 框架,一般把 AspectJ 和 Spirng 框架一起使 用,進行 AOP操作。增強就是代理的意思。
準備工作
在進行AOP操作的時候需要先引入下面四個Jar包
com.springsource.net.sf.cglib-2.2.0.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
spring-aspects-5.2.6.RELEASE.jar
引入包后的所有包如下:
com.springsource.net.sf.cglib-2.2.0.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
spring-aspects-5.2.6.RELEASE.jar
commons-logging-1.1.1.jar
spring-aop-5.2.6.RELEASE.jar
spring-beans-5.2.6.RELEASE.jar
spring-context-5.2.6.RELEASE.jar
spring-core-5.2.6.RELEASE.jar
spring-expression-5.2.6.RELEASE.jar
AspectJ的切入點表達式相關說明如下:
作用
知道對哪個類里面的哪個方法進行增強
語法
execution([權(quán)限修飾符] [返回類型] [類全路徑] [方法名稱]([參數(shù)列表]) )
示例

基于注解實現(xiàn)
主要步驟
主要步驟如下:
在spring 配置文件中,開啟注解掃描
需要在XML中引入context和aop的上下文空間。
使用注解創(chuàng)建 User 和 UserProxy 對象
在增強類上面添加注解 @Aspect
在 spring配置文件中開啟生成代理對象
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
開啟Aspectj生成對象后,會去代碼中掃描@aspect注解
配置不同類型的通知
在通知方法上面使用@Before、@AfterReturning、@Around、@AfterThrowing和@After注解,結(jié)合切入點表達式配置。
@after是在方法執(zhí)行之后執(zhí)行(有異常也執(zhí)行),@afterReturning是在返回值之后執(zhí)行(有異常不執(zhí)行)。
示例代碼
代碼結(jié)構(gòu):

User類:

UserProxy類:

Test類:

無異常返回結(jié)果:
Around 環(huán)繞之前
前置通知 before
I am add
Around 環(huán)繞之后
最終通知 after
后置通知(返回通知)afterReturning
有異常時返回結(jié)果:
Around 環(huán)繞之前
前置通知 before
最終通知 after
異常通知 afterThrowing
java.lang.ArithmeticException: / by zero
相同切入點提取
用@Pointcut標簽

多個增強類對同一個方法進行增強
用@Order注解設置增強類優(yōu)先級,數(shù)字類型值越小表示優(yōu)先級越高。
@Component
@Aspect
@Order(1)
public class PersonProxy{ }
完全注解開發(fā)
在啟動配置類中添加@EnableAspectJAutoProxy注解:
@Configuration
@ComponentScan(basePackages = { "com.spring5"})
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class ConfigAop {
}
基于配置文件實現(xiàn)
具體步驟
創(chuàng)建增強類和被增強類,創(chuàng)建相關方法
在spring 配置文件中配置兩個類對象
在 spring 配置文件中配置AOP
示例代碼
代碼結(jié)構(gòu)如下:

Student類:

StudentProxy類:

Test類:

bean.xml:

運行結(jié)果:
I am before…
I want to buy a book…
I am afterReturn…
到此,關于“什么是Spring AOP”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
文章標題:什么是SpringAOP
本文鏈接:http://chinadenli.net/article24/jijcce.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供、網(wǎng)站排名、服務器托管、手機網(wǎng)站建設、外貿(mào)建站、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)