AOP+自定义注解+反射实现操作日志修改前数据和修改后数据

AOP+自定义注解+反射实现操作日志修改前数据和修改后数据

1.自定义注解

2. 进行aop切面 

@Aspect
@Component
public class LogAspect {

    private Logger logger = LoggerFactory.getLogger(LogAspect.class);
    @Autowired
    private LogService logService;
    @Pointcut(value = "@annotation(com.ylzinfo.apps.annotation.SysLog)")
    public void logAnnotation() {
    }
    @Around(value = "logAnnotation()&& @annotation(sysLog)")
    public Object around(ProceedingJoinPoint point,SysLog sysLog) throws Exception {
        logger.info("开始切面!");
        //获取方法参数
        MethodSignature signature = (MethodSignature) point.getSignature();
        //获取操作类型
        String operationType = sysLog.operationType();
        //获取业务类型
        String ywlx = sysLog.ywlx();
        //修改之前的数据
        Object beforeJson=new Object();
        Object result=null;
        if("update".equals(operationType)){
            Object[] args = point.getArgs();
            Object arg = args[0];
            String s = JSONObject.toJSONString(arg);
            JSONObject afterJson = JSONObject.parseObject(s);
            String id = afterJson.get(sysLog.id()).toString();
            String className = point.getSignature().getDeclaringTypeName();   //被代理的类名
            Class<?> daoClass = Class.forName(className);
            Object  o =  point.getTarget();
//通过反射机制实现查询方法
            Method method = daoClass.getDeclaredMethod("selectByPrimaryKey", String.class);
            Object invoke = method.invoke(o, id);
            String oldJson = JSONObject.toJSONString(invoke);
       
            try {
                //执行方法
                result = point.proceed(args);
            } catch (Exception e) {
                throw e;
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
            //创建一个日志对象接收参数
            Twtpzj_log log = new Twtpzj_log();
            log.setBeforeupdate(oldJson);
            log.setAfterupdate(afterJson.toJSONString());
            log.setType(operationType);
            log.setYwlx(ywlx);
            logService.insertSelective(log);
        }
        return result;
    }

}

3.在web.xml中 找到spring配置文件 ,让扫描注解bean扫描到刚刚加入的注解

 

 

把切面所在的类加入到springmvc 配置文件中。

 

 3.注解调用

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Spring AOPJava实现有两种方式: 编译时增强和运行时增强。编译时增强是在编译阶段生成代理类,其中AspectJ是一个基于Java实现AOP框架,它有自己的编译器或织入器,需要使用AspectJ的编译器编译切面类才能执行。而运行时增强是在运行时动态生成代理类,其中JDK动态代理和CGLIB库是两种常用的实现方式。JDK动态代理只能代理接口,而CGLIB能代理接口和类,但不能代理被final修饰的类。JDK动态代理通过反射生成代理类,而CGLIB通过继承被代理类的方式生成代理类。Spring AOP使用了AspectJ的注解来定义切面、切入点、通知增强等,但没有使用AspectJ的代理类生成实现,所以不需要额外的AspectJ编译器或织入器。Spring AOP同时实现了通过JDK动态代理和CGLIB来生成代理类,当目标类实现了接口时,默认使用JDK动态代理,当目标类没有实现接口时,使用CGLIB。Spring AOP的切面类(用@Aspect注解标注的类)也是由IOC容器管理的Bean。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [理解Spring AOP实现与思想 案例代码](https://download.csdn.net/download/qq_37171817/12502814)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Java自定义注解Spring AOP使用AOP实现自定义注解实现日志记录](https://blog.csdn.net/suiyishiguang/article/details/126612592)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [java AOP实现方式及Spring AOP总结](https://blog.csdn.net/wenqiangluyao/article/details/126309757)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值