SpringAOP示例

工作中使用SpringAOP记录操作数据前后的变化

@Aspect
@Component
public class SystemOperateLogAop {

    private static final Logger log = LoggerFactory.getLogger(SystemOperateLogAop.class);

    @Resource
    private SystemOperateLogService sysOptLogService;
    @Resource
    private SequenceService sequenceService;

    /**
     * 定义切点:只切入注解{@link SysLog}的业务方法
     */
    @Pointcut("@annotation(org.ibond.bpm.system.annotation.SysLog)")
    public void logPointCut() {
    }

    @SuppressWarnings("unchecked")
    @Around("logPointCut()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        // 保存日志
        Long logId = saveSysLog(point);

        // 执行方法
        Object result = point.proceed();
        if (result instanceof Map) {
            Map<String, Object> res = (Map<String, Object>) result;
            Object success = res.get(ResultMessageUtils.CODE);
            SystemOperateLog operateLog = new SystemOperateLog();
            operateLog.setId(logId);
            if (success instanceof Boolean)
                operateLog.setResult(Boolean.parseBoolean(success.toString()) ? 1L : 0L);
            else
                operateLog.setResult(Long.parseLong(success.toString()));
            Object objId = res.get(ResultMessageUtils.DATA);
            if (null != objId && objId instanceof Long && StringUtils.isNotEmpty(objId.toString()))
                operateLog.setObjectid(Long.parseLong(objId.toString()));
            systemOperateLogService.updateLog(operateLog);
        }
        return result;
    }

    private Long saveSysLog(ProceedingJoinPoint joinPoint) throws Exception {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();

        SysLog sysLog = method.getAnnotation(SysLog.class);
        LogDesc logDesc = sysLog.desc();
        // RequiresPermissions permission =
        // method.getAnnotation(RequiresPermissions.class);
        // String permCode = "";
        // if (null != permission)
        // permCode = StringUtils.join(permission.value(), ",");
        // 操作对象
        Object obj = joinPoint.getArgs()[0];

        String desc = logDesc.getDesc();
        String operName = "";
        if (desc.contains(".")) {
            String[] split = desc.split("\\.");
            operName = split[split.length - 1];
        }
        SystemOperateLog operateLog = getOperateLog(obj, operName);
        sysOptLogService.createLog(logDesc, operateLog);
        sysOptLogService.insertSelective(operateLog);
        return operateLog.getId();
    }

    /**
     * 设置日志内容、对象id、对象代码
     */
    private SystemOperateLog getOperateLog(Object obj, String operType) throws Exception {
        Class<?> clazz = obj.getClass();
        Table table = clazz.getAnnotation(Table.class);
        if (null == table || StringUtils.isEmpty(table.name()))
            throw new Exception("未知的对象表名");
        Long idValue = (Long) Reflections.invokeGetter(obj, "id");
        SystemOperateLog operateLog = new SystemOperateLog();
        operateLog.setObjectid(idValue);
        operateLog.setObjectcode(table.name());
        StringBuilder cont = new StringBuilder();
        cont.append("【" + operType + "】");
        Field[] fields = clazz.getDeclaredFields();
        if (OperateType.noCompare(operType)) {
            if (OperateType.isDelete(operType)) {
                Map<String, Object> entityMap = sysOptLogService.selectEntityById(table.name(), 
                idValue);
                log.info(entityMap != null ? entityMap.toString() : "entityMap数据为空");
                obj = Reflections.mapToObj(entityMap, clazz);
            }
            for (Field field : fields) {
                Property prop = field.getAnnotation(Property.class);
                if (null == prop)
                    continue;
                Object value = Reflections.invokeGetter(obj, field.getName());
                if (null == value || StringUtils.isEmpty(value.toString()))
                    continue;
                ConvertValue convertValue = field.getAnnotation(ConvertValue.class);
                if (null != convertValue) {
                    IConvertService convertService = SpringUtils.getBean(IConvertService.class,
                    convertValue.service());
                    value = convertService.convert(value);
                }
                cont.append(prop.desc()).append(":").append(dealValue(value)).append(",");
            }
            if (cont.lastIndexOf(",") != -1)
                cont.deleteCharAt(cont.lastIndexOf(","));
            operateLog.setContent(cont.toString());
            return operateLog;
        }

        Map<String, Object> entityMap = sysOptLogService.selectEntityById(table.name(), idValue);
        Object oldObj = Reflections.mapToObj(entityMap, clazz);
        for (Field field : fields) {
            Property prop = field.getAnnotation(Property.class);
            if (null == prop)
                continue;
            String fieldName = field.getName();
            Object value = dealValue(Reflections.invokeGetter(obj, fieldName));
            if (prop.compareChange()) {
                // 使用getter获取属性值,getter方法中实现值的转换
                Object oldValue = dealValue(Reflections.invokeGetter(oldObj, fieldName));
                ConvertValue convertValue = field.getAnnotation(ConvertValue.class);
                if (null != convertValue) {
                    String propName = convertValue.convertProp();
                    IConvertService convertService = SpringUtils.getBean(IConvertService.class,
                    convertValue.service());
                    if (null != oldValue && StringUtils.isNotEmpty(oldValue.toString())) {
                        oldValue = convertService.convert(oldValue);
                    }
                    Reflections.invokeSetter(oldObj, propName, oldValue);
                    value = dealValue(Reflections.invokeGetter(obj, propName));
                }
                if (null == oldValue && null != value || null != oldValue && null == value
                        || null != oldValue && null != value && !oldValue.equals(value)) {
                    cont.append(prop.desc()).append(":").append(oldValue).append("->").append(value)
                    .append(",");
                }
            }
        }
        if (cont.lastIndexOf(",") != -1)
            cont.deleteCharAt(cont.lastIndexOf(","));
        operateLog.setContent(cont.toString());
        return operateLog;
    }

    private Object dealValue(Object obj) {
        if (null == obj || StringUtils.isEmpty((obj.toString()).trim()))
            return "";
        if (obj instanceof Number) { // 数值类型,去掉小数点后多余的0,如果最后一位是.则去掉
            String str = obj.toString();
            if (str.indexOf(".") > 0) {
                str = str.replaceAll("0+?$", "").replaceAll("[.]$", "");
            }
            return str;
        }
        return obj;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值