1. 程式人生 > >SpringAOP處理通知中的引數

SpringAOP處理通知中的引數

Spring藉助AspectJ的切點表示式語言來定義Spring切面

在spring中嘗試使用其他指示器時,會丟擲IllegalArgument-Exception異常。

如上的這些指示器,只有exception指示器是實際執行匹配的,而其他都是用來限制匹配的。

切面表示式分析

帶引數的切點表示式分解

在該切點表示式中使用了args(trackNumber)限定符。表示傳遞給playTrack()方法的int型別引數也會傳遞到通知中去。引數名trackNumber也與切點方法簽名中的引數相匹配。

建立切面

@Aspect
    public class TrackCounter
{
@Pointcut("execution(* com.wqh.aop.CompactDisc.playTrack(int))&&args(trackNumber)") public void trackPlayder(int trackNumber){} @Before("trackPlayder(trackNumber)") public void countTrack(int trackNumber) { System.out.println("前置通知:targetNumber="
+ trackNumber); } }

連線點類

@Service
    public class CompactDisc {
        public void playTrack(int trackNumber){
            System.out.println("trackNumber =" + trackNumber);
        }
    }

XML配置

 <!--啟用AspectJ的自動代理-->
    <aop:aspectj-autoproxy/>

    <!--宣告bean-->
<bean class="com.wqh.aop.TrackCounter"/> <!--自動掃描包下的類--> <context:component-scan base-package="com.wqh.aop"/>

測試

    @Test
    public void testT(){
        ApplicationContext applicationContext =
                new ClassPathXmlApplicationContext(
                        new String[]{"classpath:/spring/applicationContext.xml"});
        CompactDisc compactDisc = (CompactDisc) applicationContext.getBean("compactDisc");
        compactDisc.playTrack(12);
    }

上面給指定方法傳入的引數是12,在通知中獲取到了該引數

另外:在xml中配置切面來處理通知中的引數,其實也差不多,只是把切點表示式放到了XML配置檔案中。