需求:使用aop记录日志,排除一个包下的其中一个子包中的所有方法
方法一:合并写如下
@Pointcut("execution(* com.gisquest.platform.modules.*.web.*.*(..)) && !execution(* com.gisquest.platform.modules.monitor..*.*(..))")
说明: monitor包是modules下的一个子包,里面是关于监控的一些信息,现在想将其排除掉
方法二:分开写如下
@Pointcut("execution(* com.gisquest.platform.modules.*.web.*.*(..))")
public void modulesAspect() {}
@Pointcut("execution(* com.gisquest.platform.modules.monitor..*.*(..))")
public void modulesAspect1() {}
@Pointcut("modulesAspect() && !modulesAspect1()")
public void modulesAspect2() {}
具体使用如下
package com.gisquest.platform.aspect; import java.lang.reflect.Method; import java.util.Date; import javax.servlet.http.HttpServletRequest; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Conditional; import org.springframework.stereotype.Component; import com.gisquest.platform.common.CommonUtils; import com.gisquest.platform.common.Constants; import com.gisquest.platform.common.config.Global; import com.gisquest.platform.config.LogPlugEnable; import com.gisquest.platform.modules.logmgr.vo.SystemLog; @Aspect @Component @Conditional(LogPlugEnable.class) public class SysModulesAspect { private static final Logger log = LoggerFactory.getLogger(SysModulesAspect.class); @Autowired private HttpServletRequest request; @Pointcut("execution(* com.gisquest.platform.modules.*.web.*.*(..)) && !execution(* com.gisquest.platform.modules.monitor..*.*(..))") public void modulesAspect() {} @AfterReturning(pointcut = "modulesAspect()", argNames = "retVal", returning = "retVal") public void doAfterReturning(JoinPoint joinPoint, Object retVal) throws Throwable { SystemLog systemLog = recodeLog(joinPoint); // 特殊处理 MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); // 获取方法对象,含方法参数 Method method = methodSignature.getMethod(); // 获取方法名 String methodName = method.getName(); try { log.info(retVal.toString()); //登陆日志特殊处理 if (retVal !=null) { String str = retVal.toString(); if (methodName.contains("loginFail")) { systemLog.setOpResult("登陆失败"); }else if (methodName.contains("index")) { systemLog.setOpResult("登陆成功"); }else { systemLog.setOpResult("成功"); } } } catch (Exception e) { systemLog.setOpResult("失败"); } finally { // 设置操作时间 systemLog.setStartTime(Constants.DATEFORMATE.format(new Date())); // 日志文件输出 ModulesDesc.outPutLogFile(systemLog); } } /** * 在目标方法非正常执行完成 发生异常 抛出异常的时候会走此方法 */ @AfterThrowing(pointcut = "modulesAspect()", throwing = "e") public void doAfterThrowing(JoinPoint joinPoint, Throwable e) { SystemLog systemLog = recodeLog(joinPoint); // 设置操作结果 systemLog.setOpResult("失败"); // 设置操作时间 systemLog.setStartTime(Constants.DATEFORMATE.format(new Date())); // 日志文件输出 ModulesDesc.outPutLogFile(systemLog); log.error("出现异常" + e.getMessage()); } public SystemLog recodeLog(JoinPoint joinPoint) { SystemLog systemLog = new SystemLog(); // 特殊处理 String className = joinPoint.getSignature().getDeclaringTypeName(); MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); // 获取方法对象,含方法参数 Method method = methodSignature.getMethod(); // 获取方法名 String methodName = method.getName(); // 获取方法参数 Object[] args = joinPoint.getArgs(); // 设置项目名称 String projectName = Global.getConfig("projectName"); systemLog.setProjectName(projectName); // 设置业务系统名称 String applicationName = Global.getConfig("applicationName"); systemLog.setApplicationName(applicationName); // 使用登陆用户名 String username = request.getSession().getAttribute("username_") + ""; systemLog.setSrcUserName(username); // 设置IP systemLog.setSrcAddress(CommonUtils.getIpAddress(request)); // 设置地理位置 systemLog.setSrcGeoAddressName(Constants.DQM); // 获取进入的类名 String moduleName = className.substring(className.indexOf("modules.") + 8, className.indexOf(".web"));// 模块名称 SystemLog systemLog1 = ModulesDesc.getDvcActionDesc(moduleName, className, systemLog, methodName); systemLog.setDvcAction(systemLog1.getDvcAction()); systemLog.setSrcModules(systemLog1.getSrcModules()); return systemLog; } }