zoukankan      html  css  js  c++  java
  • 《Spring实战》第4章--面向切面的Spring--处理通知中的参数(经验总结)

    今天学习《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;
    	}
    
    }
    
  • 相关阅读:
    什么是反向代理,反向代理有什么好处?
    动态的favicons
    管理emacs dotemacs文件
    自己的部分小软件合计 2000 2013(很久没有更新了)
    经典CSS 横向导航菜单【下载】
    Web 调试,兼容浏览器的在线调试(系列)
    sql server 执行大脚本时报警告没有足够的内存继续执行程序
    c#对接顺丰图片文件
    Sql Server行转列 动态拼接sql
    centos6.2更新yum源
  • 原文地址:https://www.cnblogs.com/dongling/p/9461529.html
Copyright © 2011-2022 走看看