package com.shhxzq.fin.lifeapp.biz.utils; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.text.MessageFormat; import org.apache.log4j.Logger; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.reflect.MethodSignature; import com.shhxzq.fin.lifeapp.model.base.BaseUuidLogger; import com.shhxzq.fin.lifeapp.model.base.BusinessException; import com.shhxzq.fin.lifeapp.model.base.Log; import com.shhxzq.fin.lifeapp.model.base.LogMethodTime; /** * 服务层AOP * @author Gxx */ public class ServiceAop { /** * 日志记录器 */ Logger logger = BaseUuidLoggerUtils.getBaseUuidLogger(); /** * 方法前后操作 * @param pjp * @return * @throws Exception */ public Object around(ProceedingJoinPoint pjp) throws Throwable { /** * 获取切面方法 */ Signature sig = pjp.getSignature(); MethodSignature msig = null; if (!(sig instanceof MethodSignature)) { throw new IllegalArgumentException("该注解只能用于方法"); } msig = (MethodSignature) sig; Object target = pjp.getTarget(); Method currentMethod = target.getClass().getMethod(msig.getName(), msig.getParameterTypes()); /** * 判断是否有Logger对象,有则强制设置为BaseUuidLogger */ Field[] files = target.getClass().getDeclaredFields(); for(Field field : files) { if(field.getType() == Logger.class) { /** * 私有变量必须先设置Accessible为true */ field.setAccessible(true); /** * 判断是否第一次赋值 */ if(!(field.get(target) instanceof BaseUuidLogger)) { /** * 创建基础日志操作实体-同一个线程的uuid是一样的 */ BaseUuidLogger uuidLogger = new BaseUuidLogger(); /** * 拷贝属性-父类向子类拷贝(两层父类) */ BeanUtils.copyPropertiesLevel2(uuidLogger, field.get(target)); /** * 覆盖设置Logger对象 */ field.set(target, uuidLogger); } } } /** * 判断是否加注解@Log和@LogMethodTime */ boolean isLog = currentMethod.isAnnotationPresent(Log.class); boolean isLogMethodTime = currentMethod.isAnnotationPresent(LogMethodTime.class); /** * 类.方法 名字 */ String targetName = pjp.getTarget().getClass().getName() + "." + pjp.getSignature().getName(); /** * 注解@Log或@LogMethodTime,只要配置一个就打日志 */ if(isLog || isLogMethodTime) { String request = BeAopUtil.getStringFromRequest(pjp.getArgs()); String requestMsg = "log - {0} request - {1}"; logger.info(MessageFormat.format(requestMsg, new Object[] { targetName, request })); } /** * 开始时间 */ long begin = DateUtils.getNow().getTime(); Object result = null; try { /** * 执行方法 */ result = pjp.proceed(); } catch (BusinessException t) { logger.error(targetName + " exception occure!reason:" + t.getMessage()); throw t; } catch (Throwable t) { logger.error(targetName + " exception occure!", t); throw t; } finally { /** * 注解@LogMethodTime才计算计算时间 */ if(isLogMethodTime) { long end = DateUtils.getNow().getTime(); logger.info(targetName + " use time : " + (end - begin) / 1000.0 + "s"); } } /** * 注解@Log或@LogMethodTime,只要配置一个就打日志 */ if(isLog || isLogMethodTime) { Object response = BeAopUtil.getStringFromResponse(result); String responseMsg = "log - {0} response - {1}"; logger.info(MessageFormat.format(responseMsg, new Object[] { targetName, response })); } return result; } }