欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

什么是SpringAOP

這篇文章主要介紹“什么是Spring AOP”,在日常操作中,相信很多人在什么是Spring AOP問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”什么是Spring AOP”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

10年積累的成都做網(wǎng)站、網(wǎng)站設計經(jīng)驗,可以快速應對客戶對網(wǎng)站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡服務。我雖然不認識你,你也不認識我。但先網(wǎng)站制作后付款的網(wǎng)站建設流程,更有榆社免費網(wǎng)站建設讓你可以放心的選擇與我們合作。

什么是Spring AOP

概述

AOP是aspect-oriented programming的縮寫,譯為面向切面編程。利用 AOP 可以對業(yè)務邏輯的各個部分進行隔離,從而使得 業(yè)務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發(fā)的效率。簡單來說,AOP就是不修改源代碼在主干功能里面添加新功能。

底層原理??

AOP底層使用了動態(tài)代理:在有接口的時候使用JDK 動態(tài)代理、在沒有接口的時候使用CGLIB字節(jié)碼動態(tài)代理。

JDK動態(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類:

什么是Spring AOP

JDKProxy類:

什么是Spring AOP

運行結(jié)果:

方法之前執(zhí)行…add :傳遞的參數(shù)…[1, 2]

I am add…

方法之后執(zhí)行…com.spring5.UserDaoImpl@355da254

result:3

CGLIB字節(jié)碼動態(tài)代理

簡介

使用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類:

什么是Spring AOP

運行結(jié)果:

睡覺前脫衣服

我想睡覺…

起床穿衣服

AOP操作

概述

AOP相關的幾個術語:

  • 連接點

類里面哪些方法可以被增強,這些方法稱為連接點

  • 切入點

實際被真正增強的方法稱為切入點

  • 通知

實際增強的邏輯部分稱為通知,分為前置通知、后置通知、環(huán)繞通知、異常通知和最終通知五種類型,其中最終通知相當于JAVA的finally。

  • 切面

把通知應用到切入點過程

AspectJ

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ù)列表]) )

  • 示例

什么是Spring AOP

基于注解實現(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):

什么是Spring AOP

User類:

什么是Spring AOP

UserProxy類:

什么是Spring AOP

Test類:

什么是Spring AOP

無異常返回結(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標簽

什么是Spring AOP

多個增強類對同一個方法進行增強

用@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)如下:

什么是Spring AOP

Student類:

什么是Spring AOP

StudentProxy類:

什么是Spring AOP

Test類:

什么是Spring AOP

bean.xml:

什么是Spring AOP

運行結(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)

成都做網(wǎng)站