国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

通過實例解析Spring argNames屬性

瀏覽:54日期:2023-07-31 17:25:01

最近學習Spring,一直不太明白Srping的切面編程中的的argNames的含義,經過學習研究后,終于明白,分享一下

需要監控的類:

package bean;public class HelloApi { public void aspectTest(String a,String b){ System.out.println('in aspectTest:' + 'a:' + a + ',b:' + b); }}

類HelloApi的aspectTest方法是需監控的方法,目標是調用前獲取獲得入參a和b的值,并打印出來。

切面類:

package aspect;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import org.springframework.stereotype.Component;import java.lang.String;@Component@Aspectpublic class HelloApiAspect2 { @Pointcut(value='execution(* bean.HelloApi.aspectTest(..)) && args(a1,b2)',argNames='a1,b2') public void pointcut1(String a1,String b2){} @Before(value='pointcut1(a,b)',argNames='a,b') public void beforecase1(String a,String b){ System.out.println('1 a:' + a +' b:' + b); } //注意和beforecase1的區別是argNames的順序交換了 @Before(value='pointcut1(a,b)',argNames='b,a') public void beforecase2(String a,String b){ System.out.println('2 a:' + a +' b:' + b); }}

測試類:

package UnitTest;import org.junit.Assert;import org.junit.Test;import org.springframework.beans.factory.BeanFactory;import org.springframework.context.support.ClassPathXmlApplicationContext;import bean.HelloApi;public class Test1 { @Test public void aspectjTest1(){ BeanFactory beanFactory = new ClassPathXmlApplicationContext('chapter2/aspectTest1.xml'); HelloApi helloapi1 = beanFactory.getBean('helloapi1',HelloApi.class); helloapi1.aspectTest('a', 'b'); }}

Spring的配置文件aspectTest.xml:

<?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:p='http://www.springframework.org/schema/p' xmlns:util='http://www.springframework.org/schema/util' xmlns:context='http://www.springframework.org/schema/context' xmlns:aop='http://www.springframework.org/schema/aop' xsi:schemaLocation='http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd'> <context:component-scan base-package='aspect'></context:component-scan> <bean class='bean.HelloApi'></bean> <aop:aspectj-autoproxy></aop:aspectj-autoproxy></beans>

輸出:

2 a:b b:a1 a:a b:bin aspectTest:a:a,b:b

說明:

HelloApiAspect2定義了一個切面pointcut,切面表達式是execution(* bean.HelloApi.aspectTest(..)) && args(a1,b2),表示配對bean.HelloApi.aspectTest()方法,并且傳入參數是2個。

args(a1,b2)另外一個作用,就是定義了aspectTest(String a,String b)方法對應表達式args(a1,b2)。定義了args(a1,b2),才能把目標方法aspectTest的參數傳入到切面方法beforecase1的參數中,a參數對應a1,b參數對應b2。使用的方法是按順序一一對應,aspectTest第一個參數對args第一個參數,aspectTest第2個參數對args第2個參數.

argNames是可選的,如果沒有argNames這個參數,而編譯器設置了【在class文件生成變量調試信息】,則spring可以通過反射知道方法參數的名字,通過名字配對,Spring知道args(a1,b2)表達式里面的a1和b2,對應了pointcut1(String a1,String b2)方法里面的a1和b2。

目標方法和切入方法的參數的關系是這樣確立的:aspectTest(String a,String b) 與 args(a1,b2)關系是a對a1,b對b2(),args(a1,b2)與pointcut1(String a1,String b2)關系是args的a1對pointcut1的a1,args的a2對pointcut1的a2。解決了目標方法參數傳入到切入方法參數的問題。

但是,如果設置了argNames,Spring不再使用方法參數的名字來配對,使用argNames定義的順序來定義pointcut1(String a1,String b2)的順序,例如:argNames='a1,b2',a1在b2前面,表示pointcut1方法第一個參數是a1,第二個參數是b2。

既然不設置argNames,Spring可以根據參數名字進行配對,為什么還需要配置argNames?因為Spring要知道方法的參數名,編譯器必須設置了【在class文件生成變量調試信息】,如果沒有設置,Spring就不知道pointcut1方法的參數名了,這個時候,Spring只知道參數的類型,Spring會使用參數的類型進行配對,如果出現2個參數都是同一個類型的情況,就會報AmbiguousBindingException異常。

beforecase1和beforecase2的argNames設置的順序交換了,調用beforecase1的順序是beforecase1('a','b'),調用beforecase2的順序是beforecase2('b','a'),所以最后的輸出是

2 a:b b:a1 a:a b:b

PS:

【class文件中生成變量調試信息】在myeclipse中打開windows-》preferences,設置如下:

通過實例解析Spring argNames屬性

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
主站蜘蛛池模板: 亚洲欧洲一区二区三区久久 | 国产成人精品日本亚洲语音2 | 午夜日本一区二区三区 | 男女性高爱潮免费的国产 | 本道久久综合88全国最大色 | 草草影院私人免费入口 | 精品国产系列 | 亚洲国产成人精彩精品 | 中文字幕在线观看亚洲日韩 | 国产中文字幕视频在线观看 | 日本不卡一区视频 | 性色tv视频观看 | 一级毛片儿 | 欧美日韩一级二级三级 | 最新在线精品国自拍视频 | 热99re久久精品这里都是免费 | 2020夜夜操 | 欧美特黄视频在线观看 | 风流慈禧一级毛片在线播放 | 国产丝袜不卡一区二区 | 精品欧美一区二区三区在线观看 | 伊在人亚洲香蕉精品区 | 99久久国产综合精品成人影院 | 女人夜色黄网在线观看 | 私人玩物福利 | 免费一级特黄欧美大片久久网 | 国产亚洲精品精品国产亚洲综合 | 99久久99久久久99精品齐 | 美女张开腿黄网站免费国产 | 久久免费黄色 | 亚洲午夜精品一级在线播放放 | 日韩三级视频在线观看 | 99久久国产综合精品成人影院 | 清纯唯美综合网 | 亚洲国产高清在线 | 天堂8中文在线最新版在线 天堂8资源8在线 | 夜色1网站| 久久厕所精品国产精品亚洲 | 最新日韩欧美不卡一二三区 | 91久久精品国产亚洲 | 亚洲欧美一区二区三区四区 |