SpringAOP处理通知中的参数

来源:互联网 发布:马云 功守道 知乎 编辑:程序博客网 时间:2024/05/20 04:32

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配置文件中。