电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

基于spring AOP @Around @Before @After的區別說明

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

此段小代碼演示了spring aop中@Around @Before @After三個注解的區別

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

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

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

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

其他如AspectJ還可以讓你在構造器或屬性注入時都行,不過那不是咱們關注的,只要記住,和方法有關的前前后后都是連接點。

package com.itsoft.action;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.stereotype.Controller;/** * * @author zxf * 演示aop測試類 */@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 * 通過aop攔截后執行具體操作 */@Aspect@Componentpublic class LogIntercept { @Pointcut('execution(public * com.itsoft.action..*.*(..))') public void recordLog(){} @Before('recordLog()') public void before() { this.printLog('已經記錄下操作日志@Before 方法執行前'); } @Around('recordLog()') public void around(ProceedingJoinPoint pjp) throws Throwable{ this.printLog('已經記錄下操作日志@Around 方法執行前'); pjp.proceed(); this.printLog('已經記錄下操作日志@Around 方法執行后'); } @After('recordLog()') public void after() { this.printLog('已經記錄下操作日志@After 方法執行后'); } 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>

補充:spring aop的@Before,@Around,@After,@AfterReturn,@AfterThrowing的理解

1.AOP的基本概念

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

可以從注解方式來理解,代碼如下。

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

@pointcut(…)——切入點。為此類內一個空方法上面的注解。可以把攔截的地址表達式表示為方法簽名,利于使用起來方便。

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

三者在一塊組成一個切面。

@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!'); }}

連接點(Joinpoint) :程序能夠應用通知的一個“時機”,這些“時機”就是連接點,例如方法被調用時、異常被拋出時等等。——可以理解為被aop攔截的類或者方法就是連接點。

通知(Advice) :通知定義了切面是什么以及何時使用。描述了切面要完成的工作和何時需要執行這個工作。——可以理解為被注解有@Before等advice注解的安全校驗的方法,攔截了過來的請求要做什么邏輯的校驗。

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

目標對象(Target Object) :即被通知的對象。

AOP代理(AOP Proxy) 在Spring AOP中有兩種代理方式,JDK動態代理和CGLIB代理。默認情況下,TargetObject實現了接口時,則采用JDK動態代理;反之,采用CGLIB代理。

織入(Weaving)把切面應用到目標對象來創建新的代理對象的過程,織入一般發生在如下幾個時機:

(1)編譯時:當一個類文件被編譯時進行織入,這需要特殊的編譯器才能做到,例如AspectJ的織入編譯器;

(2)類加載時:使用特殊的ClassLoader在目標類被加載到程序之前增強類的字節代碼;

(3)運行時:切面在運行的某個時刻被織入,SpringAOP就是以這種方式織入切面的,原理是使用了JDK的動態代理。

2 通知(Advice)類型的說明

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

為啥不能阻止線程進入核心代碼呢?

因為@Before注解的方法入參不能傳ProceedingJoinPoint,而只能傳入JoinPoint。

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

而JoinPoint沒有這個方法。

這里牽扯區別這兩個類:Proceedingjoinpoint 繼承了 JoinPoint 。

是在JoinPoint的基礎上暴露出 proceed 這個方法。proceed很重要,這個是aop代理鏈執行的方法。

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

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

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

@After 后通知(After advice) :當某連接點退出的時候執行的通知(不論是正常返回還是異常退出)。

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

@Around 環繞通知(Around advice) :包圍一個連接點的通知,類似Web中Servlet規范中的Filter的doFilter方法。

可以在方法的調用前后完成自定義的行為,也可以選擇不執行。

這時aop的最重要的,最常用的注解。

用這個注解的方法入參傳的是ProceedingJionPoint pjp,可以決定當前線程能否進入核心方法中——通過調用pjp.proceed();

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

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

這里說下簡單情況——針對一個方法只被一個aspect類攔截時,aspect類內部的 advice 將按照以下的順序進行執行情況如下:

基于spring AOP @Around @Before @After的區別說明

基于spring AOP @Around @Before @After的區別說明

解釋:執行到核心業務方法或者類時,會先執行AOP。在aop的邏輯內,先走@Around注解的方法。

然后是@Before注解的方法,然后這兩個都通過了,走核心代碼,核心代碼走完,無論核心有沒有返回值,都會走@After方法。

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

復雜的同一個方法被多個Aspect類攔截請參看博文:Spring AOP @Before @Around @After 等 advice 的執行順序。

4 在aop中校驗不通過如何不讓程序進入核心代碼?

通過aop中注解的執行的先后順序我們知道,校驗發生在核心代碼前面的只剩下兩個——@Before,@Around。

@Before : 這個注解只有在異常時才不會走核心方法——連接點。正常@Before無法阻止當前線程進入連接點。

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

所以一般我們用這個注解,如果aop的安全校驗不通過,則不調用proceed()方法,就永遠不會進入連接點。

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

但是普通的數據類型是不限制的。

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

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: Spring
相關文章:
主站蜘蛛池模板: 激光内雕_led玻璃_发光玻璃_内雕玻璃_导光玻璃-石家庄明晨三维科技有限公司 激光内雕-内雕玻璃-发光玻璃 | 广州活动策划公司-15+年专业大型公关活动策划执行管理经验-睿阳广告 | TPU薄膜_TPU薄膜生产厂家_TPU热熔胶膜厂家定制_鑫亘环保科技(深圳)有限公司 | 美国PARKER齿轮泵,美国PARKER柱塞泵,美国PARKER叶片泵,美国PARKER电磁阀,美国PARKER比例阀-上海维特锐实业发展有限公司二部 | 【甲方装饰】合肥工装公司-合肥装修设计公司,专业从事安徽办公室、店面、售楼部、餐饮店、厂房装修设计服务 | 阳光1号桔柚_无核沃柑_柑橘新品种枝条苗木批发 - 苧金网 | 临朐空调移机_空调维修「空调回收」临朐二手空调 | 定硫仪,量热仪,工业分析仪,马弗炉,煤炭化验设备厂家,煤质化验仪器,焦炭化验设备鹤壁大德煤质工业分析仪,氟氯测定仪 | 彩信群发_群发彩信软件_视频短信营销平台-达信通 | 超声波分散机-均质机-萃取仪-超声波涂料分散设备-杭州精浩 | 数字展示在线_数字展示行业门户网站 | 防堵吹扫装置-防堵风压测量装置-电动操作显示器-兴洲仪器 | 工控机,嵌入式主板,工业主板,arm主板,图像采集卡,poe网卡,朗锐智科 | 双杰天平-国产双杰电子天平-美国双杰-常熟双杰仪器 | 齿轮减速马达一体式_蜗轮蜗杆减速机配电机-德国BOSERL齿轮减速电动机生产厂家 | 双工位钻铣攻牙机-转换工作台钻攻中心-钻铣攻牙机一体机-浙江利硕自动化设备有限公司 | 焊缝跟踪系统_激光位移传感器_激光焊缝跟踪传感器-创想智控 | 洁净实验室工程-成都手术室净化-无尘车间装修-四川华锐净化公司-洁净室专业厂家 | 电表箱-浙江迈峰电力设备有限公司-电表箱专业制造商 | 谷歌关键词优化-外贸网站优化-Google SEO小语种推广-思亿欧外贸快车 | 百度网站优化,关键词排名,SEO优化-搜索引擎营销推广 | uv固化机-丝印uv机-工业烤箱-五金蚀刻机-分拣输送机 - 保定市丰辉机械设备制造有限公司 | 雾度仪_雾度计_透光率雾度仪价格-三恩时(3nh)光电雾度仪厂家 | 昆明挖掘机修理厂_挖掘机翻新再制造-昆明聚力工程机械维修有限公司 | 保镖公司-私人保镖-深圳保镖公司【环宇兄弟保镖】 | 法兰螺母 - 不锈钢螺母制造厂家 - 万千紧固件--螺母街 | 深圳公司注册-工商注册代理-注册公司流程和费用_护航财税 | 防勒索软件_数据防泄密_Trellix(原McAfee)核心代理商_Trellix(原Fireeye)售后-广州文智信息科技有限公司 | 水稻烘干机,小麦烘干机,大豆烘干机,玉米烘干机,粮食烘干机_巩义市锦华粮食烘干机械制造有限公司 水环真空泵厂家,2bv真空泵,2be真空泵-淄博真空设备厂 | 滤芯,过滤器,滤油机,贺德克滤芯,精密滤芯_新乡市宇清流体净化技术有限公司 | 合景一建-无尘车间设计施工_食品医药洁净车间工程装修总承包公司 | 北京自然绿环境科技发展有限公司专业生产【洗车机_加油站洗车机-全自动洗车机】 | 马尔表面粗糙度仪-MAHR-T500Hommel-Mitutoyo粗糙度仪-笃挚仪器 | 透平油真空滤油机-变压器油板框滤油机-滤油车-华之源过滤设备 | 玻璃钢罐_玻璃钢储罐_盐酸罐厂家-河北华盛节能设备有限公司 | 铝单板_铝窗花_铝单板厂家_氟碳包柱铝单板批发价格-佛山科阳金属 | 插针变压器-家用电器变压器-工业空调变压器-CD型电抗器-余姚市中驰电器有限公司 | 家用净水器代理批发加盟_净水机招商代理_全屋净水器定制品牌_【劳伦斯官网】 | 塑钢件_塑钢门窗配件_塑钢配件厂家-文安县启泰金属制品有限公司 深圳南财多媒体有限公司介绍 | 铆钉机|旋铆机|东莞旋铆机厂家|鸿佰专业生产气压/油压/自动铆钉机 | 中山市派格家具有限公司【官网】|