在spring配置
1編寫自己的注解類
2.編寫注解解析類
3.配置spring aop代理 (下面我使用注解 如使用配置 配置切點即可,有兩種代理默認jdk代理 設置true 為cglib代理)
//注解類
1 /** 2 * 自定義注解 攔截器 3 * @author 4 * 給需要監控的方法加上改注解,就可以實現該方法的日志記錄 5 */ 6 @Target({ ElementType.PARAMETER, ElementType.METHOD }) 7 @Retention(RetentionPolicy.RUNTIME) 8 @Documented 9 public @interface WbmsService{ 10 //描述 11 String description() default ""; 12 //操作類型 同步:sync 異步 async 13 String oprateType() default ""; 14 //客戶名稱 15 String clientName() default ""; 16 } 17 18 使用方法 在被調用的方法實現類上添加該注解 19 20 @WbmsService(description = "客戶欠款查詢", oprateType = "sync", clientName = "")
@Aspect @Component public class InterfaceRecord { // logService private IBizLogRecordService bizLogRecordService; // 初始化日志類 private static final Log logger = LogFactory.getLog(InterfaceRecord.class); // Service層切點 @Pointcut("@annotation(com.deppon.dpap.module.common.server.aop.WbmsService)") public void serviceAspect() { } @Before(value = "serviceAspect()") public void doBefore(JoinPoint joinPoint) { String now = DateUtil.getToday(); logger.info("接口攔截開始時間:" + now); } @AfterReturning(value = "serviceAspect()", argNames = "retVal", returning = "retVal") public void doAfterReturning(JoinPoint joinPoint, Object retVal) { String now = DateUtil.getToday(); logger.info("接口攔截結束時間:" + now); WbmsLogEntity log = new WbmsLogEntity(); try { // 補充數據 log = supplementEntity(log, joinPoint); // 返回參數 String responseStr = ""; if (retVal != null) { responseStr = JSON.toJSONString(retVal); } // 響應內容 log.setResponsContent(responseStr); // 成功狀態 log.setIsSuccess(Constant.YES); // 保存到數據庫 bizLogRecordService.saveWbmsLog(log); } catch (Exception e) { logger.error("==異常通知異常=="); logger.error("異常信息:{}", e); } } /** * @Title: doAfterThrowing * @Description: TODO 異常統一處理 * @param tags * @return return_type * @throws */ @AfterThrowing(pointcut = "serviceAspect()", throwing = "e") public void doAfterThrowing(JoinPoint joinPoint, Throwable e) { String now = DateUtil.getToday(); logger.error("接口異常攔截時間:" + now); logger.error("接口異常信息:" + e); WbmsLogEntity log = new WbmsLogEntity(); try { // 補充數據 log = supplementEntity(log, joinPoint); // 異常狀態 log.setIsSuccess(Constant.NO); String responseStr = ""; if (e != null) { responseStr = JSON.toJSONString(e); } // 響應信息 log.setResponsContent(responseStr); // 保存到數據庫 bizLogRecordService.saveWbmsLog(log); } catch (Exception ee) { logger.error("==異常通知異常=="); logger.error("異常信息:{}", ee); } } /** * @Title: supplementEntity * @Description: TODO 填充數據 * @param tags * @return return_type * @throws */ private WbmsLogEntity supplementEntity(WbmsLogEntity log, JoinPoint joinPoint) { try { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder .getRequestAttributes()).getRequest(); // 請求的IP String ip = request.getRemoteAddr(); // 客戶端IP log.setClientIp(ip); } catch (Exception ee) { // TODO: handle exception logger.error("獲取不到httprequest:" + ee); } // 注解 Map<String, String> annos = getServiceMthodAnnotatin(joinPoint); // 客戶名稱 log.setClientName(annos.get("clientName")); // 創建時間 log.setCreateTime(new Date()); // 操作功能 String requestMethod = joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName() + "()"; logger.info("請求方法:" + requestMethod); log.setOprateMethod(requestMethod); // 操作時間 log.setOprateTime(new Date()); // 操作類型 log.setOprateType(annos.get("oprateType")); // 操作描述 log.setOprateDes(annos.get("description")); // 請求參數 StringBuffer requestStr = new StringBuffer(); JSONArray jay = new JSONArray(); // 獲取請求參數 if (joinPoint.getArgs() != null && joinPoint.getArgs().length > 0) { for (int i = 0; i < joinPoint.getArgs().length; i++) { if (i != joinPoint.getArgs().length - 1) { requestStr.append(JSON.toJSONString(joinPoint.getArgs()[i])); requestStr.append(","); } else { requestStr.append(JSON.toJSONString(joinPoint.getArgs()[i])); } } } String arrayStr = "[" + requestStr + "]"; jay = JSON.parseArray(arrayStr); // 操作單據 // 操作人 List<String> createUserCodes = new ArrayList<String>(); // 操作人數據 createUserCodes.add("customerCode"); createUserCodes.add("createCode"); createUserCodes.add("operatePersoncode"); createUserCodes.add("disablePercode"); String createUserCode = JsonUtil.analysisJson(jay, createUserCodes); // 創建人 log.setCreateUserCode(createUserCode); // 修改人 log.setModifyUserCode(createUserCode); // 操作人 log.setOpratePer(createUserCode); // 請求參數 log.setRequestContent(requestStr.toString()); // 修改時間 log.setUpdateTime(new Date()); return log; } public void setBizLogRecordService(IBizLogRecordService bizLogRecordService) { this.bizLogRecordService = bizLogRecordService; } /** * 獲取注解中對方法的描述信息 用於service層注解 * * @param joinPoint * 切點 * @return 方法描述 * @throws Exception */ @SuppressWarnings("rawtypes") public static Map<String, String> getServiceMthodAnnotatin( JoinPoint joinPoint) { // 結果 Map<String, String> result = new HashMap<String, String>(); // 獲取target class名稱 String targetName = joinPoint.getTarget().getClass().getName(); // 獲取target method名稱 String methodName = joinPoint.getSignature().getName(); // 獲取請求參數 Object[] arguments = joinPoint.getArgs(); // 注解類 try { Class targetClass = Class.forName(targetName); Method[] methods = targetClass.getMethods(); // 注解方法 String description = ""; String oprateType = ""; String clientName = ""; for (Method method : methods) { if (method.getName().equals(methodName)) { Class[] clazzs = method.getParameterTypes(); if (clazzs.length == arguments.length) { description = method.getAnnotation(WbmsService.class) .description(); oprateType = method.getAnnotation(WbmsService.class) .oprateType(); clientName = method.getAnnotation(WbmsService.class) .clientName(); // 接口描述 result.put("description", description); // 操作類型 result.put("oprateType", oprateType); // 客戶名稱 result.put("clientName", clientName); break; } } } } catch (ClassNotFoundException e) { e.printStackTrace(); } return result; } }
<!-- aop激活自動代理功能 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>