日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

基于spring AOP @Around @Before @After的區(qū)別說(shuō)明

瀏覽:136日期:2023-07-22 18:55:53

此段小代碼演示了spring aop中@Around @Before @After三個(gè)注解的區(qū)別

@Before是在所攔截方法執(zhí)行之前執(zhí)行一段邏輯。

@After 是在所攔截方法執(zhí)行之后執(zhí)行一段邏輯。

@Around是可以同時(shí)在所攔截方法的前后執(zhí)行一段邏輯。

連接點(diǎn)(JoinPoint) 這個(gè)就更好解釋了,就是spring允許你是通知(Advice)的地方,那可就真多了,基本每個(gè)方法的前、后(兩者都有也行),或拋出異常是時(shí)都可以是連接點(diǎn),spring只支持方法連接點(diǎn)。

其他如AspectJ還可以讓你在構(gòu)造器或?qū)傩宰⑷霑r(shí)都行,不過(guò)那不是咱們關(guān)注的,只要記住,和方法有關(guān)的前前后后都是連接點(diǎn)。

package com.itsoft.action;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.stereotype.Controller;/** * * @author zxf * 演示aop測(cè)試類 */@Controllerpublic class UserAction { public void queryUsers(){ System.out.println('查詢所有用戶【all users list】'); } public static void main(String[] args) { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext('application-aop.xml'); UserAction userAction = (UserAction)ctx.getBean('userAction'); userAction.queryUsers(); ctx.destroy(); }}

package com.itsoft;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import org.springframework.stereotype.Component;/** * * @author Administrator * 通過(guò)aop攔截后執(zhí)行具體操作 */@Aspect@Componentpublic class LogIntercept { @Pointcut('execution(public * com.itsoft.action..*.*(..))') public void recordLog(){} @Before('recordLog()') public void before() { this.printLog('已經(jīng)記錄下操作日志@Before 方法執(zhí)行前'); } @Around('recordLog()') public void around(ProceedingJoinPoint pjp) throws Throwable{ this.printLog('已經(jīng)記錄下操作日志@Around 方法執(zhí)行前'); pjp.proceed(); this.printLog('已經(jīng)記錄下操作日志@Around 方法執(zhí)行后'); } @After('recordLog()') public void after() { this.printLog('已經(jīng)記錄下操作日志@After 方法執(zhí)行后'); } private void printLog(String str){ System.out.println(str); }}

<?xml version='1.0' encoding='UTF-8'?><beans xmlns='http://www.springframework.org/schema/beans' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:aop='http://www.springframework.org/schema/aop' xmlns:context='http://www.springframework.org/schema/context' xsi:schemaLocation=' http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd'> <context:annotation-config /> <context:component-scan base-package='com.itsoft'/> <aop:aspectj-autoproxy /></beans>

補(bǔ)充:spring aop的@Before,@Around,@After,@AfterReturn,@AfterThrowing的理解

1.AOP的基本概念

切面(Aspect) :通知(advice)和切入點(diǎn)(pointcut)共同組成了切面(aspect),時(shí)間、地點(diǎn)和要發(fā)生的“故事”。

可以從注解方式來(lái)理解,代碼如下。

@aspect為類上面的注解——切面

@pointcut(…)——切入點(diǎn)。為此類內(nèi)一個(gè)空方法上面的注解??梢园褦r截的地址表達(dá)式表示為方法簽名,利于使用起來(lái)方便。

@before@after等——通知。為此類下面的方法上面的注解。

三者在一塊組成一個(gè)切面。

@Aspectpublic class ExampleAspect { @Pointcut('execution(* com.psjay.example.spring.aop.*.*(..))') public void aPointcut() { } @Before('aPointcut()') public void beforeAdvice() { System.out.println('before advice is executed!'); }}

連接點(diǎn)(Joinpoint) :程序能夠應(yīng)用通知的一個(gè)“時(shí)機(jī)”,這些“時(shí)機(jī)”就是連接點(diǎn),例如方法被調(diào)用時(shí)、異常被拋出時(shí)等等?!梢岳斫鉃楸籥op攔截的類或者方法就是連接點(diǎn)。

通知(Advice) :通知定義了切面是什么以及何時(shí)使用。描述了切面要完成的工作和何時(shí)需要執(zhí)行這個(gè)工作?!梢岳斫鉃楸蛔⒔庥蠤Before等advice注解的安全校驗(yàn)的方法,攔截了過(guò)來(lái)的請(qǐng)求要做什么邏輯的校驗(yàn)。

切入點(diǎn)(Pointcut) :通知定義了切面要發(fā)生的“故事”和時(shí)間,那么切入點(diǎn)就定義了“故事”發(fā)生的地點(diǎn),例如某個(gè)類或方法的名稱。——可以理解為切面切向哪里?是個(gè)類或者某層的包路徑。

目標(biāo)對(duì)象(Target Object) :即被通知的對(duì)象。

AOP代理(AOP Proxy) 在Spring AOP中有兩種代理方式,JDK動(dòng)態(tài)代理和CGLIB代理。默認(rèn)情況下,TargetObject實(shí)現(xiàn)了接口時(shí),則采用JDK動(dòng)態(tài)代理;反之,采用CGLIB代理。

織入(Weaving)把切面應(yīng)用到目標(biāo)對(duì)象來(lái)創(chuàng)建新的代理對(duì)象的過(guò)程,織入一般發(fā)生在如下幾個(gè)時(shí)機(jī):

(1)編譯時(shí):當(dāng)一個(gè)類文件被編譯時(shí)進(jìn)行織入,這需要特殊的編譯器才能做到,例如AspectJ的織入編譯器;

(2)類加載時(shí):使用特殊的ClassLoader在目標(biāo)類被加載到程序之前增強(qiáng)類的字節(jié)代碼;

(3)運(yùn)行時(shí):切面在運(yùn)行的某個(gè)時(shí)刻被織入,SpringAOP就是以這種方式織入切面的,原理是使用了JDK的動(dòng)態(tài)代理。

2 通知(Advice)類型的說(shuō)明

@Before 前置通知(Before advice) :在某連接點(diǎn)(JoinPoint)——核心代碼(類或者方法)之前執(zhí)行的通知,但這個(gè)通知不能阻止連接點(diǎn)前的執(zhí)行。

為啥不能阻止線程進(jìn)入核心代碼呢?

因?yàn)锧Before注解的方法入?yún)⒉荒軅鱌roceedingJoinPoint,而只能傳入JoinPoint。

要知道從aop走到核心代碼就是通過(guò)調(diào)用ProceedingJionPoint的proceed()方法。

而JoinPoint沒(méi)有這個(gè)方法。

這里牽扯區(qū)別這兩個(gè)類:Proceedingjoinpoint 繼承了 JoinPoint 。

是在JoinPoint的基礎(chǔ)上暴露出 proceed 這個(gè)方法。proceed很重要,這個(gè)是aop代理鏈執(zhí)行的方法。

暴露出這個(gè)方法,就能支持 aop:around 這種切面(而其他的幾種切面只需要用到JoinPoint,這跟切面類型有關(guān)), 能決定是否走代理鏈還是走自己攔截的其他邏輯。

建議看一下 JdkDynamicAopProxy的invoke方法,了解一下代理鏈的執(zhí)行原理。

這樣你就能明白 proceed方法的重要性。

@After 后通知(After advice) :當(dāng)某連接點(diǎn)退出的時(shí)候執(zhí)行的通知(不論是正常返回還是異常退出)。

@AfterReturning 返回后通知(After return advice) :在某連接點(diǎn)正常完成后執(zhí)行的通知,不包括拋出異常的情況。

@Around 環(huán)繞通知(Around advice) :包圍一個(gè)連接點(diǎn)的通知,類似Web中Servlet規(guī)范中的Filter的doFilter方法。

可以在方法的調(diào)用前后完成自定義的行為,也可以選擇不執(zhí)行。

這時(shí)aop的最重要的,最常用的注解。

用這個(gè)注解的方法入?yún)鞯氖荘roceedingJionPoint pjp,可以決定當(dāng)前線程能否進(jìn)入核心方法中——通過(guò)調(diào)用pjp.proceed();

@AfterThrowing 拋出異常后通知(After throwing advice) : 在方法拋出異常退出時(shí)執(zhí)行的通知。

3 advice(通知)注解的執(zhí)行先后順序

這里說(shuō)下簡(jiǎn)單情況——針對(duì)一個(gè)方法只被一個(gè)aspect類攔截時(shí),aspect類內(nèi)部的 advice 將按照以下的順序進(jìn)行執(zhí)行情況如下:

基于spring AOP @Around @Before @After的區(qū)別說(shuō)明

基于spring AOP @Around @Before @After的區(qū)別說(shuō)明

解釋:執(zhí)行到核心業(yè)務(wù)方法或者類時(shí),會(huì)先執(zhí)行AOP。在aop的邏輯內(nèi),先走@Around注解的方法。

然后是@Before注解的方法,然后這兩個(gè)都通過(guò)了,走核心代碼,核心代碼走完,無(wú)論核心有沒(méi)有返回值,都會(huì)走@After方法。

然后如果程序無(wú)異常,正常返回就走@AfterReturn,有異常就走@AfterThrowing。

復(fù)雜的同一個(gè)方法被多個(gè)Aspect類攔截請(qǐng)參看博文:Spring AOP @Before @Around @After 等 advice 的執(zhí)行順序。

4 在aop中校驗(yàn)不通過(guò)如何不讓程序進(jìn)入核心代碼?

通過(guò)aop中注解的執(zhí)行的先后順序我們知道,校驗(yàn)發(fā)生在核心代碼前面的只剩下兩個(gè)——@Before,@Around。

@Before : 這個(gè)注解只有在異常時(shí)才不會(huì)走核心方法——連接點(diǎn)。正常@Before無(wú)法阻止當(dāng)前線程進(jìn)入連接點(diǎn)。

@Around : 這個(gè)注解在連接點(diǎn)前后執(zhí)行。并且注解的方法傳入的ProceedingJionPoint 類中封裝的代理方法proceed()可以讓當(dāng)前線程從aop方法轉(zhuǎn)到連接點(diǎn)——核心代碼方法。

所以一般我們用這個(gè)注解,如果aop的安全校驗(yàn)不通過(guò),則不調(diào)用proceed()方法,就永遠(yuǎn)不會(huì)進(jìn)入連接點(diǎn)。

除此外,要注意除了Around注解的方法可以傳ProceedingJionPoint 外,別的幾個(gè)都不能傳這個(gè)類。

但是普通的數(shù)據(jù)類型是不限制的。

注解的方法的返回值也不限制,可以自由限制。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
大香伊人久久精品一区二区| 久久精品1区| 蜜桃视频欧美| 99亚洲视频| 日韩精品一级| 久久97久久97精品免视看秋霞| 国产一区二区三区黄网站| 日本精品在线中文字幕| 亚洲欧美日韩国产一区二区| 午夜在线精品| 国产乱子精品一区二区在线观看 | 精品国产亚洲日本| 92国产精品| 99日韩精品| 国产欧美日韩精品一区二区三区| 高清久久一区| 国产亚洲永久域名| 欧美亚洲综合视频| 欧美xxxx中国| 久久国产精品毛片| 麻豆精品一区二区综合av| 91精品一区二区三区综合在线爱| 9国产精品视频| 国产精品v一区二区三区| 九九精品调教| 日韩激情中文字幕| 日韩国产一区二区三区| 99在线观看免费视频精品观看| 久久国产乱子精品免费女| 日韩电影免费在线观看| 亚洲欧美网站在线观看| 亚洲永久av| 蜜臀久久99精品久久久久久9| 久久97视频| 免费观看日韩电影| 日本一二区不卡| 日韩欧美中文字幕电影| 老牛影视精品| 久久国产三级精品| 欧美日韩色图| 国产精品18| 在线综合视频| 成人亚洲一区| 欧美日韩a区| 好看的亚洲午夜视频在线| 老司机精品视频在线播放| 老牛国产精品一区的观看方式| 成人精品高清在线视频| 亚欧成人精品| 婷婷亚洲综合| 国产精品久久久久久久久久10秀 | 国产精品对白久久久久粗| 好吊一区二区三区| 中文在线а√天堂| 日本精品另类| 日韩中文字幕区一区有砖一区| 国产精品字幕| 久久精品国内一区二区三区| 日本成人在线一区| 久久午夜精品| 亚洲欧美日韩高清在线| 成人国产精品一区二区网站| 日本中文字幕视频一区| 在线成人直播| 丝袜av一区| 韩国女主播一区二区三区| 欧美日韩99| 亚洲精品视频一二三区| 国产女优一区| 免费久久99精品国产自在现线| 激情综合亚洲| 亚洲高清不卡| 久久免费国产| 99热精品久久| 久久蜜桃精品| 99国产精品免费视频观看| 神马午夜在线视频| 日韩国产在线| 欧美成人a交片免费看| 精品99在线| 国产在视频一区二区三区吞精| 免费一级欧美片在线观看网站 | 狠狠色综合网| 日韩午夜一区| 视频一区二区不卡| 男人天堂欧美日韩| 亚洲一区国产| 免费看黄色91| 亚洲欧洲国产精品一区| 蜜臀久久99精品久久久久久9| 在线亚洲一区| 久久亚洲图片| 日本一区二区中文字幕| 日本91福利区| 国产调教精品| 黄色精品视频| 亚洲91视频| 在线一区免费观看| 亚洲人妖在线| 国产伦理久久久久久妇女| 免费一级欧美在线观看视频 | 国产伦精品一区二区三区千人斩| 日韩不卡一区二区三区| 国产精品调教| 狂野欧美性猛交xxxx| 日本欧美国产| 九色porny丨国产首页在线| 999久久久亚洲| 久久福利影视| 日韩二区三区四区| 精品入口麻豆88视频| 久久久一本精品| 制服诱惑一区二区| 日韩在线成人| 韩国一区二区三区视频| 亚洲国产影院| 综合欧美精品| 欧美激情91| 欧美日韩水蜜桃| 亚洲精品日韩久久| 岛国精品一区| 国产模特精品视频久久久久| 人人爱人人干婷婷丁香亚洲| 精品91福利视频| av亚洲免费| 97久久精品| 日韩一区亚洲二区| 免费在线观看日韩欧美| 美女视频一区在线观看| 激情偷拍久久| 欧美精品三级在线| 欧美二三四区| 中文精品电影| 国产aⅴ精品一区二区三区久久| 亚洲国产日韩欧美在线| 久久国产麻豆精品| 亚洲爱爱视频| 亚洲精品亚洲人成在线观看| 精品国产亚洲日本| 日本欧洲一区二区| 激情综合五月| 日精品一区二区三区| 日韩在线视频精品| 视频国产精品| 99久久婷婷这里只有精品| 久久精品999| 91九色精品| 国产精品久久久久77777丨| 亚洲精品888| 麻豆国产精品| 亚洲久久在线| 欧美影院三区| 久久精品国产99| 亚洲综合激情在线| 久久久久国产| 久久精品毛片| 日韩精品一页| 国产亚洲在线观看| 国产一区二区三区成人欧美日韩在线观看| 国产精品日韩久久久| 中文在线免费视频| 91成人福利| 好吊视频一区二区三区四区| 国产aa精品| 国产精品一区二区三区av麻| 亚洲色诱最新| 精品日韩视频| 国产精品a久久久久| 一区二区日韩免费看| 天堂√中文最新版在线| 久久精品超碰| 性欧美长视频| 久久久久午夜电影| 精品欠久久久中文字幕加勒比| 日本不卡视频一二三区| 免费日韩av| 91成人网在线观看| 成人福利视频| 久久香蕉精品香蕉| 97久久亚洲| 日韩久久99| 色综合视频一区二区三区日韩| 黑丝一区二区三区| 久久要要av| 亚洲天堂1区| 日韩深夜视频| 日韩国产激情| 国产高清不卡| 中文字幕在线看片| 欧美激情aⅴ一区二区三区 | 9999国产精品| 国产精品色婷婷在线观看| 婷婷综合福利| 亚洲日韩视频| 亚洲人亚洲人色久| 蜜桃视频免费观看一区| 午夜在线视频观看日韩17c| 好看的av在线不卡观看| 99riav1国产精品视频| 黄色成人91|