下面的代码是工作中根据自己想法写的,或许有缺陷未知但不失为一种风格,记录下来:
// 这是从request中获取Url的固定参数 private final static String URL_MAPPING = HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE; // url和方法的对应关系 public static Map<String,String> urlMthod = new HashMap<String,String>(); static { urlMthod.put("/user/add.xhtm", "add"); } // 下面为方法中转器,即每个aop都走到这个方法中,通过切面参数寻找它对应的业务方法。 public void dataStatisticBefore(JoinPoint joinPoint) { Long currentTime = System.currentTimeMillis(); Object[] objects = joinPoint.getArgs(); for(Object object : objects ) { if(object instanceof HttpServletRequest) { HttpServletRequest sr = (HttpServletRequest) object; String url = (String) sr.getAttribute((URL_MAPPING)); String methodName = urlMthod.get(url);// 获取方法名 try { this.getClass() .getMethod( methodName,new Class[] { String.class,HttpServletRequest.class,Long.class,String.class}) .invoke(this, new Object[] {url,sr,currentTime,methodName});// 通过方法名转到具体处理 } catch (Exception e) { logDataStatistic.error("aop dataStatistic_Around : " + url + " error :", e); } break; } } } // 具体处理方法 public void add(...) { }