《Spring实战》第4章--面向切面的Spring--处理通知中的参数(经验总结)
2018-08-11 23:13
417 查看
今天学习《Spring实战》第4章《面向切面的Spring》,根据4.3.3小节写出如下切面类:
package proxy; import java.util.HashMap; import java.util.Map; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; @Component @Aspect public class Audience { private Map<Integer, Integer> trackCounts = new HashMap<>(); @Pointcut("execution(** concert.JayPerform.playTrack(int)) && args(trackNum)") //<1> public void track(int trackNum) {} //<2> @AfterReturning("track(trackNum)") //<3> public void countTrack(int trackNum) //<4> { int currentCount = getPlayCount(trackNum); trackCounts.put(trackNum, currentCount+1); System.out.println("------- 这首歌播放了"+(currentCount+1)+"次"); } public int getPlayCount(int trackNumber) { return trackCounts.containsKey(trackNumber)?trackCounts.get(trackNumber):0; } }
代码中 <1>、<2>、<3>、<4> 处,int型参数的名称都是trackNum,这样保证了从命名切点到通知方法的参数转移。并且,这里的参数trackNum与concert.JayPerform.playTrack(int trackNum) 的参数命名相同。
经过实验,发现这4处的参数名称与concert.JayPerform.playTrack(int trackNum)中的参数名称不必相同,只要<1>与<2>处参数名称相同、<3>与<4>处参数名称相同即可。这四处代码可修改如下:
package proxy; import java.util.HashMap; import java.util.Map; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; @Component @Aspect public class Audience { private Map<Integer, Integer> trackCounts = new HashMap<>(); @Pointcut("execution(** concert.JayPerform.playTrack(int)) && args(num1)") //<1> public void track(int num1) {} //<2> @AfterReturning("track(val1)") //<3> public void countTrack(int val1) //<4> { int currentCount = getPlayCount(val1); trackCounts.put(val1, currentCount+1); System.out.println("------- 这首歌播放了"+(currentCount+1)+"次"); } public int getPlayCount(int trackNumber) { return trackCounts.containsKey(trackNumber)?trackCounts.get(trackNumber):0; } }
相关文章推荐
- 【读书笔记】Spring实战(第4章 面向切面的Spring)
- Spring3 MVC (三)---请求处理方法 参数及返回值总结
- Spring AOP那些学术概念—通知、增强处理连接点(JoinPoint)切面(Aspect)
- 经验总结33--面向切面的过滤器
- 黑马程序员--Spring Aop 面向切面编程,实现前置通知
- Spring AOP 面向切面编程 常见通知实现(前置,后置,环绕,异常)
- Spring实战-读书笔记(章节四)-面向切面的Spring
- 详解spring切面使用传递给被通知方法的参数
- 第4章 面向切面的Spring
- springboot之aop面向切面处理
- 经验总结33--面向切面的过滤器
- Spring面向切面编程的三种方式以及常用相关案例总结
- 解释通知Spring AOP 面向切面编程
- 【#】Spring3 MVC (三)---请求处理方法 参数及返回值总结
- spring-aop中around切面中处理参数
- 【Spring】【笔记】《Spring In Action》第4章 面向切面的Spring
- Spring学习总结之面向切面(AOP)
- Spring AOP 处理通知中的参数【Spring 入门】
- 第4章 面向切面的Spring 笔记1
- 第4章 面向切面的Spring--xml配置切面 笔记2