SpringAOP的介紹和使用方法

這篇文章主要介紹“SpringAOP的介紹和使用方法”,在日常操作中,相信很多人在SpringAOP的介紹和使用方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”SpringAOP的介紹和使用方法”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

公司主營業(yè)務(wù):成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出明山免費(fèi)做網(wǎng)站回饋大家。

一、AOP介紹

AOP ,面向切面編程,在運(yùn)行時(shí),動(dòng)態(tài)地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程。其實(shí)就是在代碼運(yùn)行,進(jìn)行一定的包裝,如在方法執(zhí)行前、方法返回后、方法拋出異常后等地方進(jìn)行一定的攔截處理或者叫增強(qiáng)處理

先講一下AspectJ和Spring AOP關(guān)系,網(wǎng)上很多文章對(duì)AspectJ存在錯(cuò)誤說法

AspectJ:

  • AspectJ 來自于 Eclipse 基金會(huì),是Eclipse托管給Apache基金會(huì)的一個(gè)開源項(xiàng)目

  • 屬于靜態(tài)織入,它是通過修改代碼來實(shí)現(xiàn)的,它的織入時(shí)機(jī)可以是:

    • Compile-time weaving:編譯期織入

    • Post-compile weaving:也就是已經(jīng)生成了 .class 文件,就要用到編譯后織入

    • Load-time weaving:指的是在加載類的時(shí)候進(jìn)行織入

  • AspectJ框架非常強(qiáng)大,它是 AOP 編程的完全解決方案。Spring AOP 致力于解決的是企業(yè)級(jí)開發(fā)中最普遍的 AOP 需求(方法織入)

  • AspectJ 在實(shí)際代碼運(yùn)行前完成了織入,所以大家會(huì)說它生成的類是沒有額外運(yùn)行時(shí)開銷的

SpringAOP:

  • 基于動(dòng)態(tài)代理來實(shí)現(xiàn)。默認(rèn)地,如果使用接口的,用 JDK 提供的動(dòng)態(tài)代理實(shí)現(xiàn),如果沒有接口,使用 CGLIB 實(shí)現(xiàn)

  • Spring AOP 和AspectJ并沒有什么太多的關(guān)系,僅僅是Spring 延用了 AspectJ 中的概念,包括使用了 AspectJ 提供的 jar 包中的注解,但是不依賴于其實(shí)現(xiàn)功能

  • Spring AOP 需要依賴于 IOC 容器來管理,只能作用于 Spring 容器中的 Bean,它是使用純粹的 Java 代碼實(shí)現(xiàn)的,只能作用于 bean 的方法

  • Spring AOP 比 AspectJ 的性能稍差

二、Spring AOP術(shù)語解釋

Joinpoint(連接點(diǎn))
所謂連接點(diǎn)是指能夠被攔截到的點(diǎn)。在spring中,這些點(diǎn)指的是方法,因?yàn)閟pring只支持方法類型的連接點(diǎn)(任何一個(gè)方法都可以稱為連接點(diǎn))

Pointcut(切入點(diǎn))
切入點(diǎn)是指我們要對(duì)哪些Joinpoint進(jìn)行攔截的定義(對(duì)哪個(gè)方法進(jìn)行增強(qiáng))

Advice(通知/增強(qiáng))
通知是指攔截到Joinpoint之后所要做的事情就是通知.通知分為前置通知,后置通知,異常通知,最終通知,環(huán)繞通知(切面要完成的功能)(要給它增加什么功能)

Target(目標(biāo)對(duì)象)
代理的目標(biāo)對(duì)象

Weaving(織入)
是指把增強(qiáng)應(yīng)用到目標(biāo)對(duì)象來創(chuàng)建新的代理對(duì)象的過程(怎樣得到代理對(duì)象)

Proxy(代理)
一個(gè)類被AOP織入增強(qiáng)后,就產(chǎn)生一個(gè)結(jié)果代理類

Aspect(切面)
是切入點(diǎn)和通知的結(jié)合,構(gòu)成切面,我們可以使用注解或者xml進(jìn)行配置

三、Spring AOP注解使用

1. 在 xml 中配置
開啟 @AspectJ 的注解,還有其它方式,這里不介紹

<aop:aspectj-autoproxy/>

2. 使用@Aspect注解
定義實(shí)現(xiàn)AOP的配置類
@Aspect 注解要作用在 bean 上面

@Component@Aspectpublic class LogAspect {}

3. 配置 Pointcut
用于定義哪些方法需要被增強(qiáng)或者說需要被攔截

    @Pointcut(""execution(* com.ljj.service(..))"")private void controllerAspect() {// TODO Auto-generated method stub}
     @Pointcut("@annotation(com.ljj.annotation.Log)")private void controllerAspect1() {// TODO Auto-generated method stub}@Pointcut(""within(com.ljj.service..*)"")private void controllerAspect2() {// TODO Auto-generated method stub}@Pointcut("bean(*Service)")private void controllerAspect3() {// TODO Auto-generated method stub}
  • execution ,正則匹配方法簽名

  • @annotation。匹配對(duì)應(yīng)注解的方法

  • within,指定所在類或所在包下面的方法

  • bean(idOrNameOfBean), 匹配 bean 的名字

4. 配置 Advice

   @Aspectpublic class AdviceExample {// 下面方法就是寫攔截 "dao層實(shí)現(xiàn)"@Before("com.ljj.aop.dataAccessOperation()")public void doAccessCheck() {// ... 實(shí)現(xiàn)代碼}@Before("execution(* com.ljj.dao.*.*(..))")public void doAccessCheck() {// ... 實(shí)現(xiàn)代碼}@AfterReturning("com.ljj.aop.dataAccessOperation()")public void doAccessCheck() {// ...}@AfterReturning(pointcut="com.ljj.aop.dataAccessOperation()",returning="retVal")public void doAccessCheck(Object retVal) {// 這樣,進(jìn)來這個(gè)方法的處理時(shí)候,retVal 就是相應(yīng)方法的返回值,是不是非常方便// ... 實(shí)現(xiàn)代碼}// 異常返回@AfterThrowing("com.ljj.aop.dataAccessOperation()")public void doRecoveryActions() {// ... 實(shí)現(xiàn)代碼}@AfterThrowing(pointcut="com.ljj.aop.dataAccessOperation()",throwing="ex")public void doRecoveryActions(DataAccessException ex) {// ... 實(shí)現(xiàn)代碼}// 注意理解它和 @AfterReturning 之間的區(qū)別,這里會(huì)攔截正常返回和異常的情況@After("com.ljj.aop.dataAccessOperation()")public void doReleaseLock() {// 通常就像 finally 塊一樣使用,用來釋放資源。// 無論正常返回還是異常退出,都會(huì)被攔截到}// 既能做 @Before 的事情,也可以做 @AfterReturning 的事情@Around("com.ljj.businessService()")public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {// start stopwatchObject retVal = pjp.proceed();// stop stopwatchreturn retVal;}}

上面Advice都已經(jīng)匹配了對(duì)應(yīng)的PointCut,這樣定義可以不用再定義PointCut了。也可以使用下面這種PointCut + Advice

//定義日志注解@Target({ ElementType.PARAMETER, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Log {//操作名String optName();//操作類型OperateType optType();//操作表名String optTable();//操作編碼String optCode();
  }


   @Pointcut("@annotation(com.ljj.annotation.Log)")private void controllerAspect() {// TODO Auto-generated method stub}//日志切面@Around("controllerAspect()")public Object around(ProceedingJoinPoint pjp) throws Throwable {   try {   		//方法執(zhí)行前操作result = point.proceed();//方法執(zhí)行后操作} catch (Exception e) {e.printStackTrace();}}

到此,關(guān)于“SpringAOP的介紹和使用方法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

新聞名稱:SpringAOP的介紹和使用方法
文章來源:http://bm7419.com/article44/pcdsee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、電子商務(wù)網(wǎng)站收錄、面包屑導(dǎo)航企業(yè)網(wǎng)站制作、小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)