@Pointcut("(execution(* com.club.risk.center.service.impl.*.*(java.lang.String))) || (execution(* com.club.risk.py.service.impl.PyServcieImpl.queryPyReportByApplId(java.lang.String))) || (execution(* com.club.risk.zengxintong.service.Impl.ZXTServiceImpl.queryZxtReportByApplId(..)))")
这是多个切点组合形成使用||连接。
我在实际项目中使用的key也比applId复杂,因为可能只使用applId的话导致key冲突,
所以项目中使用的key是applId:方法全限定名,,这样的话key能够保证是一定不一致的。
如下:
//先获取目标方法参数 String applId = null; Object[] args = joinPoint.getArgs(); if (args != null && args.length > 0) { applId = String.valueOf(args[0]); } //获取目标方法所在类 String target = joinPoint.getTarget().toString(); String className = target.split("@")[0]; //获取目标方法的方法名称 String methodName = joinPoint.getSignature().getName(); //redis中key格式: applId:方法名称 String redisKey = applId + ":" + className + "." + methodName;
所以上面的是一种通用的处理,具体到项目中还要看具体情况。
以前没有自己写过AOP代码,这次使用突然发现AOP确实强大,在整个过程中除了配置文件我没有改任何以前的源代码,功能全部是切入进去的。
这个Demo也基本上实现了需求,只需要设置切点,能够将缓存应用到各种查询方法中,或设置切点为service.impl包,直接作用于所有service方法。
Spring AOP四种实现方式
Spring AOP自定义注解方式实现日志管理