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

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

淺談Spring AOP中args()和argNames的含義

瀏覽:3日期:2023-07-04 08:42:27
args()的作用主要有兩點(diǎn):

1、切入點(diǎn)表達(dá)式部分如果增加了args()部分,那么目標(biāo)方法除了要滿足execution部分,還要滿足args()對(duì)方法參數(shù)的要求,對(duì)于符合execution表達(dá)式,但不符合args參數(shù)的方法,不會(huì)被植入切面。

2、定義了args()之后,才能把目標(biāo)方法的參數(shù)傳入到切面方法的參數(shù)中(通過(guò)Joinpoint也可以獲取參數(shù),但當(dāng)前方法是直接用切面方法參數(shù)接受)。

示例1

目標(biāo)方法:

@RestController@RequestMapping('/testAop')public class TestController { private Logger logger = LoggerFactory.getLogger(TestController.class); @RequestMapping('/helloworld') public String helloWorld(String id, Integer age){System.out.println('被代理方法正在執(zhí)行');return null; }}

切面方法

@After('execution(* com.bxp.controller.TestController.*(..)) && args(userId, userAge)') public void after(JoinPoint point, String userId, Integer userAge){System.out.println('userId===========' + userId);System.out.println('userAge===========' + userAge); }

輸出結(jié)果:

被代理方法正在執(zhí)行userId===========bian1996userAge===========24

定義了args(userId, userAge)才能把目標(biāo)方法helloWorld(String id, Integer age)的參數(shù)傳入到增強(qiáng)處理方法after的參數(shù)中,id參數(shù)對(duì)應(yīng)userId,age參數(shù)對(duì)應(yīng)userAge。使用的方法是按順序一一對(duì)應(yīng),helloWorld第一個(gè)參數(shù)對(duì)args第一個(gè)參數(shù),helloWorld第2個(gè)參數(shù)對(duì)args第2個(gè)參數(shù)。

切入點(diǎn)表達(dá)式部分增加了&&args(userId, userAge)部分,意味著可以在增強(qiáng)處理方法中定義userId、userAge兩個(gè)形參------定義這兩個(gè)形參時(shí),形參類型可以隨意指定,但是一旦指定,譬如這里分別是String類型和Integer類型,這兩個(gè)形參類型將用于限制該切入點(diǎn)只匹配第一個(gè)參數(shù)類型為String,第二個(gè)參數(shù)類型為Integer的方法。

也就是,args()中的參數(shù)會(huì)和目標(biāo)方法的參數(shù)除了在順序上一一對(duì)應(yīng)之外,在類型上也要對(duì)應(yīng),否則匹配失敗,如下兩種情況都會(huì)匹配失敗。

@RequestMapping('/helloworld')public String helloWorld(Integer id, Integer age){ System.out.println('被代理方法正在執(zhí)行'); return null;} @After('execution(* com.bxp.controller.TestController.*(..)) && args(userId, userAge)')public void after(JoinPoint point, String userId, String userAge){ System.out.println('userId===========' + userId); System.out.println('userAge===========' + userAge);}@RequestMapping('/helloworld')public String helloWorld(Integer sex, String id, Integer age){ System.out.println('被代理方法正在執(zhí)行'); return null;} @After('execution(* com.bxp.controller.TestController.*(..)) && args(userId, userAge)') public void after(JoinPoint point, String userId, Integer userAge){ System.out.println('userId===========' + userId); System.out.println('userAge===========' + userAge); }

除此之外,使用args()表達(dá)式時(shí)還可使用如下形式:args(userId, userAge,..),這表明增強(qiáng)處理方法中可以通過(guò)userId, userAge來(lái)訪問(wèn)目標(biāo)方法的參數(shù)。注意上面args表達(dá)式括號(hào)中的2點(diǎn),它表示可以匹配更多參數(shù),但是只要前兩個(gè)userId, userAge參數(shù)匹配上了,目標(biāo)方法就可以被匹配上。

argNames是可選的,如果沒(méi)有argNames這個(gè)參數(shù),而編譯器設(shè)置了【在class文件生成變量調(diào)試信息】,則spring可以通過(guò)反射知道方法參數(shù)的名字,通過(guò)名字配對(duì),Spring知道args(userId, userAge)表達(dá)式里面的userId和userAge,對(duì)應(yīng)了增強(qiáng)方法public void after(JoinPoint point, String userId, Integer userAge)方法里面的userId和userAge,就是第一個(gè)示例的情況:

總結(jié):

目標(biāo)方法和args()通過(guò)參數(shù)順序一一進(jìn)行匹配

args()和增強(qiáng)方法通過(guò)參數(shù)名稱一致進(jìn)行匹配。

但是,如果設(shè)置了argNames,Spring不再使用方法參數(shù)的名字來(lái)配對(duì),使用argNames定義的順序來(lái)給

after(JoinPoint point, String userAge, String userId)的參數(shù)傳值,例如:argNames='userId,userAge',userId在userAge前面,表示after方法第一個(gè)參數(shù)(JoinPoint 除外)是userId,第二個(gè)參數(shù)是userAge,示例如下:

目標(biāo)方法

@RequestMapping('/helloworld')public String helloWorld(String id, String age){ System.out.println('被代理方法正在執(zhí)行'); return null;}

切面方法

@After(value = 'execution(* com.bxp.controller.TestController.*(..)) && args(userId, userAge)', argNames = 'userId,userAge')public void after(JoinPoint point, String userAge, String userId){ System.out.println('userId===========' + userId); System.out.println('userAge===========' + userAge);}

請(qǐng)求連接和輸出結(jié)果

請(qǐng)求連接http://localhost:8088/testAop/helloworld?age=24&id=bian1996輸出結(jié)果被代理方法正在執(zhí)行userId===========24userAge===========bian1996注意:這一次兩個(gè)參數(shù)的類型都給成String類型了

總結(jié):

目標(biāo)方法和args()通過(guò)參數(shù)順序一一進(jìn)行匹配

args()和argNames通過(guò)參數(shù)名稱一致進(jìn)行匹配

argNames和增強(qiáng)方法通過(guò)參數(shù)順序一一對(duì)應(yīng)。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 直流电能表-充电桩电能表-导轨式电能表-智能电能表-浙江科为电气有限公司 | 涂层测厚仪_光泽度仪_uv能量计_紫外辐照计_太阳膜测试仪_透光率仪-林上科技 | 无缝钢管-聊城无缝钢管-小口径无缝钢管-大口径无缝钢管 - 聊城宽达钢管有限公司 | 塑料异型材_PVC异型材_封边条生产厂家_PC灯罩_防撞扶手_医院扶手价格_东莞市怡美塑胶制品有限公司 | 福建省教师资格证-福建教师资格证考试网 | 纳米二氧化硅,白炭黑,阴离子乳化剂-臻丽拾科技 | 818手游网_提供当下热门APP手游_最新手机游戏下载 | 东莞市海宝机械有限公司-不锈钢分选机-硅胶橡胶-生活垃圾-涡电流-静电-金属-矿石分选机 | 骨密度仪-骨密度测定仪-超声骨密度仪-骨龄测定仪-天津开发区圣鸿医疗器械有限公司 | 高楼航空障碍灯厂家哪家好_航空障碍灯厂家_广州北斗星障碍灯有限公司 | ICP备案查询_APP备案查询_小程序备案查询 - 备案巴巴 | 板式换网器_柱式换网器_自动换网器-郑州海科熔体泵有限公司 | 地源热泵一体机,地源热泵厂家-淄博汇能环保设备有限公司 | 广东西屋电气有限公司-广东西屋电气有限公司 | [品牌官网]贵州遵义双宁口腔连锁_贵州遵义牙科医院哪家好_种植牙_牙齿矫正_原华美口腔 | 开锐教育-学历提升-职称评定-职业资格培训-积分入户 | 硅胶管挤出机厂家_硅胶挤出机生产线_硅胶条挤出机_臣泽智能装备 贵州科比特-防雷公司厂家提供贵州防雷工程,防雷检测,防雷接地,防雷设备价格,防雷产品报价服务-贵州防雷检测公司 | 硬度计,金相磨抛机_厂家-莱州华煜众信试验仪器有限公司 | 沈阳液压泵_沈阳液压阀_沈阳液压站-沈阳海德太科液压设备有限公司 | 橡胶接头|可曲挠橡胶接头|橡胶软接头安装使用教程-上海松夏官方网站 | 防火板_饰面耐火板价格、厂家_品牌认准格林雅 | 蜂蜜瓶-玻璃瓶-玻璃瓶厂-玻璃瓶生产厂家-徐州贵邦玻璃制品有限公司 | AGV叉车|无人叉车|AGV智能叉车|AGV搬运车-江西丹巴赫机器人股份有限公司 | 车辆定位管理系统_汽车GPS系统_车载北斗系统 - 朗致物联 | 氨水-液氨-工业氨水-氨水生产厂家-辽宁顺程化工 | 新能源汽车电机定转子合装机 - 电机维修设备 - 睿望达 | 立式壁挂广告机厂家-红外电容触摸一体机价格-华邦瀛 | 交通气象站_能见度检测仪_路面状况监测站- 天合环境科技 | 上海防爆真空干燥箱-上海防爆冷库-上海防爆冷柜?-上海浦下防爆设备厂家? | 工业CT-无锡璟能智能仪器有限公司| 千斤顶,液压千斤顶-力良企业,专业的液压千斤顶制造商,shliliang.com | 陕西安玻璃自动感应门-自动重叠门-磁悬浮平开门厂家【捷申达门业】 | 国际船舶网 - 船厂、船舶、造船、船舶设备、航运及海洋工程等相关行业综合信息平台 | 低温等离子清洗机(双气路进口)-嘉润万丰 | 清水-铝合金-建筑模板厂家-木模板价格-铝模板生产「五棵松」品牌 | 防潮防水通风密闭门源头实力厂家 - 北京酷思帝克门窗 | 湖州织里童装_女童男童中大童装_款式多尺码全_织里儿童网【官网】-嘉兴嘉乐网络科技有限公司 | 河南道路标志牌_交通路标牌_交通标志牌厂家-郑州路畅交通 | 踏板力计,制动仪,非接触多功能速度仪,逆反射系数测试仪-创宇 | 济南保安公司加盟挂靠-亮剑国际安保服务集团总部-山东保安公司|济南保安培训学校 | 艾默生变频器,艾默生ct,变频器,ct驱动器,广州艾默生变频器,供水专用变频器,风机变频器,电梯变频器,艾默生变频器代理-广州市盟雄贸易有限公司官方网站-艾默生变频器应用解决方案服务商 |