SpringAOP处理通知中的参数

xiaoxiao2021-02-28  82

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

转载请注明原文地址: https://www.6miu.com/read-69672.html

最新回复(0)