日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring-AOP @AspectJ切点函数之execution()

發(fā)布時間:2025/3/21 javascript 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring-AOP @AspectJ切点函数之execution() 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 概述
  • 通過execution()定義切點的不同方式
    • 通過方法簽名定義切點
    • 通過類定義切點
    • 通過類包定義切點
    • 通過方法入?yún)⒍x切點
  • 實例

概述

execution()是最常用的切點函數(shù),語法如下

execution(<修飾符模式>?<返回類型模式><方法名模式>(<參數(shù)模式>)<異常模式>?)

其中:返回類型模式、方法名模式、參數(shù)模式是必選項。


通過execution()定義切點的不同方式

下面我們通過各種實例來理解如何使用execution()

通過方法簽名定義切點

  • execution(public * *(..)) 匹配所有目標(biāo)類的public方法。 第一個*代表返回類型,第二個*代表方法名,而..代表任意入?yún)⒌姆椒?/font>

  • execution(* *To(..)) 匹配目標(biāo)類所有以To為后綴的方法。 第一個*代表返回類型,而*To代表任意以To為后綴的方法。


通過類定義切點

  • execution(* com.xgj.aop.spring.advisor.aspectJ.function.execution.classpoint.Cleaner.*(..))匹配Cleaner接口的所有方法(包括實現(xiàn)類中覆寫的方法), 第一個 * 代表返回任意類型 ,...Cleaner.*代表Cleaner接口中的所有方法

  • execution(* com.xgj.aop.spring.advisor.aspectJ.function.execution.classpoint.Cleaner.*(..))匹配Cleaner接口及其所有實現(xiàn)類的方法,不但匹配實現(xiàn)類中覆寫的方法,也包括實現(xiàn)類中不在接口中定義的方法


通過類包定義切點

在類名模式串中,.*表示包下的所有類,..*表示包、子孫包下的所有類

  • execution(* com.xgj.*(..))匹配com.xgj包下所有類的所有方法

  • execution(* com.xgj..*(..))匹配com.xgj包、子孫包下所有類的所有方法.比如 com.xgj.dao ,com.xgj.service,com.xgj.dao.user包下所有類的所有方法都匹配。 當(dāng) ..出現(xiàn)在類名中時,必須后面跟*表示子孫包下的所有類。

  • execution(* com..*Dao.find*(..))匹配包名前綴為com的任何包下類名后綴為Dao的方法,方法名必須以find為前綴, 比如com.xgj.UserDao#findUserById()方法都是匹配切點。


通過方法入?yún)⒍x切點

切點表達式中的方法入?yún)⒉糠直容^復(fù)雜,可以使用*和..通配符。 其中 *表示任意參數(shù)類型的參數(shù), 而..表示任意類型的參數(shù)且參數(shù)個數(shù)不限。

  • execution(* joke(String,int))匹配joke(String,int)方法,且joke方法的第一個入?yún)⑹荢tring,第二個入?yún)⑹莍nt。 比如 匹配 SmartSeller#joke(String ,int)方法。 如果方法中的入?yún)㈩愋褪莏ava.lang包下的,這可以直接使用類名,否則必須使用全限定類名,比如 joke(java.util.List,int)

  • execution(* joke(String,*))匹配目標(biāo)類中的joke()方法,該方法第一個入?yún)镾tring,第二個入?yún)槿我忸愋汀?比如 joke(String s1, String s2)和joke(String s1,double d)都匹配,但是 joke(String s1, String s2,double d3)不匹配

  • execution(* joke(String,..))匹配目標(biāo)類中的joke方法,該方法的第一個入?yún)镾tring,后面可以有任意個入?yún)⑶胰雲(yún)㈩愋筒幌蕖?比如 joke(String s1),joke(String s1,String s2)和joke(String s1,double d2,String s3)都匹配。

  • execution(* joke(Object+))匹配目標(biāo)類中的joke()方法,方法擁有一個入?yún)?#xff0c;且入?yún)⑹荗bject類型或該類的子類。 它匹配joke(String s1) 和joke(Client c) . 如果定義的切點是execution(* joke(Object)) ,則只匹配joke(Object object)而不匹配joke(String s1) 或者joke(Client c)


實例

代碼已托管到Github—> https://github.com/yangshangwei/SpringMaster

僅以通過方法簽名定義切點為例子,其余場景請參考https://github.com/yangshangwei/SpringMaster, 親測通過。

execution(* com.xgj.aop.spring.advisor.aspectJ.function.execution.classpoint.Cleaner.*(..))

package com.xgj.aop.spring.advisor.aspectJ.function.execution;public class NaiveWaiter {/*** public方法,演示execution(public * *(..)),能匹配到*/public void greetTo(String clientName) {System.out.println("NaiveWaiter greet to " + clientName);}} package com.xgj.aop.spring.advisor.aspectJ.function.execution;public class SmartSeller {/*** public方法,演示execution(public * *(..)),能匹配到*/public void sell(String goods) {System.out.println("SmartSeller sells " + goods);}/*** * * @Title: smileTo* * @Description: 非public方法,演示execution(public * *(..)),不能匹配到* * @param clientName* * @return: void*/protected void smileTo(String clientName) {System.out.println("SmartSeller simles to " + clientName);}}

切面

package com.xgj.aop.spring.advisor.aspectJ.function.execution;import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before;/*** * * @ClassName: ExecutionPublicAspect* * @Description: TODO* * @author: Mr.Yang* * @date: 2017年8月27日 下午1:47:55*/@Aspect public class ExecutionPublicAspect {@Before("execution(public * *(..))")public void crossCuttingLogic() {System.out.println("織入前置增強,橫切邏輯code");}}

配置文件

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!-- 使用基于Schema的aop命名空間進行配置 --><!-- 基于@AspectJ切面的驅(qū)動器 --> <aop:aspectj-autoproxy/><!-- 目標(biāo)Bean --> <bean id="smartSeller" class="com.xgj.aop.spring.advisor.aspectJ.function.execution.SmartSeller"/> <bean id="naiveWaiter" class="com.xgj.aop.spring.advisor.aspectJ.function.execution.NaiveWaiter"/> <!-- 使用了@AspectJ注解的切面類 --> <bean class="com.xgj.aop.spring.advisor.aspectJ.function.execution.ExecutionPublicAspect"/></beans>

測試類

package com.xgj.aop.spring.advisor.aspectJ.function.execution;import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;/*** * * @ClassName: ExecutionPublicAspectTest* * @Description: execution(public * *(..)) 測試類* * @author: Mr.Yang* * @date: 2017年8月27日 下午1:52:25*/ public class ExecutionPublicAspectTest {@Testpublic void test() {ApplicationContext ctx = new ClassPathXmlApplicationContext("com/xgj/aop/spring/advisor/aspectJ/function/execution/conf-execution.xml");SmartSeller smartSeller = (SmartSeller) ctx.getBean("smartSeller");// sell方法是public,會織入前置增強中的橫切邏輯smartSeller.sell("bread");// smileTo方法是protec,不會織入前置增強中的橫切邏輯smartSeller.smileTo("XiaoGongJiang");NaiveWaiter naiveWaiter = (NaiveWaiter) ctx.getBean("naiveWaiter");// greetTo方法是public,會織入前置增強中的橫切邏輯naiveWaiter.greetTo("XiaoGongJiang");}}

運行結(jié)果

2017-08-29 00:00:39,395 INFO [main] (AbstractApplicationContext.java:583) - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@24b9371e: startup date [Tue Aug 29 00:00:39 BOT 2017]; root of context hierarchy 2017-08-29 00:00:39,514 INFO [main] (XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from class path resource [com/xgj/aop/spring/advisor/aspectJ/function/execution/conf-execution.xml] 織入前置增強,橫切邏輯code SmartSeller sells bread SmartSeller simles to XiaoGongJiang 織入前置增強,橫切邏輯code NaiveWaiter greet to XiaoGongJiang

總結(jié)

以上是生活随笔為你收集整理的Spring-AOP @AspectJ切点函数之execution()的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 最新av在线播放 | 国产免费999| 最新网址av | 日韩三级一区二区三区 | 国产精品久久久久久久久免费看 | 狠狠鲁狠狠干 | 色秀视频网 | 一级日韩片 | missav | 免费高清av在线看 | 天天干狠狠操 | 黄色国产片 | 欧美一级欧美三级 | 女人喂男人奶水做爰视频 | 黑人玩弄人妻一区二区三区 | 久久国产乱子伦精品 | 日韩18p | a在线v| 久久久精品一区 | 国产激情视频在线 | 久久精品国产99国产精品 | 国产亚洲午夜 | 肥婆大荫蒂欧美另类 | www.69视频 | 波多野结衣一本一道 | 影音先锋中文字幕人妻 | 老鸭窝av在线 | 69一区二区 | 97中文字幕| 国产精品每日更新 | 亚洲国产日韩一区二区 | 欧美精品久久久久久久 | 天美视频在线观看 | 人妻无码久久一区二区三区免费 | 国产免费不卡av | 夜夜草天天干 | 亚洲人成电影网站 | 性色AV无码久久一区二区三 | 免费在线观看一区二区 | 亚洲熟妇毛茸茸 | 波多野结衣在线观看一区二区三区 | 亚洲午夜精品在线观看 | 美女黄视频在线观看 | 亚洲激情在线视频 | 浮生影视在线观看免费 | 成人伊人 | www伊人| 韩国美女主播跳舞 | 波多野结衣二区 | 午夜在线精品偷拍 | av一区二区在线观看 | 手机在线看片1024 | 激情丁香网 | 日韩av三级在线观看 | 加勒比一区在线 | 久久精品国产99精品国产亚洲性色 | 成人免费精品视频 | 日韩美女一区二区三区 | 久久久久久久极品内射 | 国产精品99999 | 国产玖玖| 午夜精品久久久久久毛片 | 欧美精品啪啪 | 国产中文字幕91 | 成人91在线观看 | 木木影院 | 久久久久久爱 | 免费不卡av | 亚洲综合第一区 | 波多野结衣视频一区 | 天堂91| 涩涩视频在线免费看 | 久久99热人妻偷产国产 | 一区二区三区精品久久久 | 黄色大片a级| 自拍偷拍第五页 | 日韩视频一区二区三区四区 | 欧美福利一区二区 | www.夜夜 | 欧美呦交 | 欧美被狂躁喷白浆精品 | 久久6精品 | 一区二区三区日韩 | 亚洲精品电影院 | 在线免费黄色片 | 久草a在线| 久久久性 | 青青草日韩| 大桥未久av在线播放 | 最新中文字幕免费视频 | 欧美乱妇15p | 97麻豆视频 | 精品国产va久久久久久久 | 欧美高清视频在线观看 | 99久久久无码国产 | 久久手机看片 | 国产精品久久久精品 | 波多野结衣操 | 性工作者十日谈 | 亚欧三级 |