AOP实例 – 环绕增强 日志记录

news2024/11/13 9:02:18

AOP实例 – 环绕增强 日志记录

需求:记录图书的service层的日志操作,到数据库

1. 创建商品日志记录表 Book_Log

2. 完成日志记录表的插入逻辑

3. 环绕增强搜集日志记录参数,并测试

4. 环绕增强调用日志记录表的插入逻辑,完成日志记录功能

5. 正常执行目标类的核心代码

注意:需要采用Spring IOC 模式,加载bean

  1. 创建实体类:BookLog

  1. 书写相应的BookLogDao,BookLogDaoMapper.xml,BookLogService,BookLogServiceImpl,Junit

public interface BookLogDao {

    //新增,入参传实体类名
    public int insertLog(BookLog bookLog);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
        <!--com.nz.dao.BookDao类路径名-->
<mapper namespace="com.nz.dao.BookLogDao">

        <!-- 通用查询映射结果 -->
        <resultMap id="BaseResultMap" type="com.nz.entity.BookLog">
            <id column="id" property="id" />
            <result column="action_class" property="actionClass" />
            <result column="method_name" property="methodName" />
            <result column="args" property="args" />
            <result column="create_date" property="createDate" />
        </resultMap>

        <insert id="insertLog">
            insert into book_log(action_class,method_name,args)
            VALUES(#{actionClass},#{methodName},#{args})
        </insert>
</mapper>
public interface BookLogService {

    //新增
    public boolean addLog(BookLog bookLog);
}
package com.nz.service.impl;

import com.nz.dao.BookLogDao;
import com.nz.entity.Book;
import com.nz.entity.BookLog;
import com.nz.service.BookLogService;
import com.nz.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;

/**
 * Created by 86185 on 2023/1/31.
 */
public class BookLogServiceImpl implements BookLogService{


    @Override
    public boolean addLog(BookLog bookLog) {
        //获得sqlSession
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        //获取dao对象 session 代理
        //BookDao.class就是BookDao的类名
        BookLogDao bookLogDao = sqlSession.getMapper(BookLogDao.class);
        int i = bookLogDao.insertLog(bookLog);
        if(i>0){
            sqlSession.commit();
            return true;
        }
//        关闭session
        MyBatisUtil.close();
        //反参
        return false;
    }
}
 @Test
    public void springMethod5() {
        BookLogService bookLogService = (BookLogService) context.getBean("bookLogService");
        BookLog bookLog = new BookLog();
        bookLog.setActionClass("class");bookLog.setMethodName("name");bookLog.setArgs("args");
        boolean b1 = bookLogService.addLog(bookLog);
        System.out.print(b1);
    }

3.

package com.nz.aop;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

/**
 * Created by 86185 on 2023/1/31.
 */
public class LogInterceptor implements MethodInterceptor{

    @Override
    public Object invoke(MethodInvocation arg0) throws Throwable {
        System.out.print("this is my log interceptor");
        //获取目标方法名
        String methodName = arg0.getMethod().getName();
        //获取目标类名
        String actionClass = arg0.getThis().getClass().toString();
        //获取参数列表
        Object[] arguments = arg0.getArguments();
        //初始化反参
        String args = "";
        for(int i=0;i<arguments.length;i++){
            args = args + arguments[i]+"-";
        }
        //添加日志
        //放行目标代码
        Object object = arg0.proceed();
        return object;
    }
}

4.

public class BookServiceImpl implements BookService {
    @Override
    //注解是放到哪里,哪里生效,注解有切入的功能,绑定了增强功能
    @AnnotationLog
    public boolean addBook(String bookName,String bookAuth,String bookBrief) {
        //获得sqlSession
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        //获取dao对象 session 代理
        //BookDao.class就是BookDao的类名
        BookDao bookDao = sqlSession.getMapper(BookDao.class);
        int i = bookDao.insertBook(bookName, bookAuth, bookBrief);
        sqlSession.commit();
        return true;
    }
 @Test
    public void springMethod3(){
        BookService bookService = (BookService) context.getBean("bookService");
        boolean b1 = bookService.addBook("bookName", "auth", "brief");
        System.out.print(b1);
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/189171.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【目标检测论文解读复现NO.29】基于YOLO-ST的安全帽佩戴精确检测算法

前言此前出了目标改进算法专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读最新目标检测算法论文&#xff0c;…

Spire.Barcode 5.1.0 for Java Patch

Spire.Barcode for Java是专门为开发人员设计的专业条码组件&#xff0c;用于在 Java 应用程序&#xff08;J2SE 和 J2EE&#xff09;上生成、读取和扫描 一维和二维条码。开发人员和程序员可以使用 Spire.Barcode 快速轻松地将企业级条码格式添加到他们的 Java 应用程序中。需…

【数字逻辑】逻辑函数式化简为其他形式

以 F&#xff08;A,B,C&#xff09;ABA‾CF&#xff08;A,B,C&#xff09; AB\overline{\rm A}CF&#xff08;A,B,C&#xff09;ABAC 为例&#xff0c;说明如何将与或式转换为其它类型的表达式。

CE认证和CCC认证区别?

CE认证和CCC认证区别? 参考链接:https://baijiahao.baidu.com/s?id=1728784934635704528&wfr=spider&for=pc CE认证和CCC认证有什么区别? 我发现我的很多朋友对此并不了解。 同时我发现很多产品在很多产品包装上都通过了CCC和CE认证,所以可能会引起没有做过产品…

硬件 -CPU工作原理

1.地址空间一个处理器能够访问&#xff08;读写&#xff09;的存储空间有限&#xff0c;我们称空间为地址空间&#xff0c;一般来说N位地址总线的处理器的地址空间是2的N次方。CPU从内存中取数据&#xff0c;先发地址&#xff0c;内存收到后&#xff0c;发送地址所在的数据。2.…

蓝奥声无线同步数据传输技术在物联网方面应用的优势

随着物联网技术的发展&#xff0c;其应用场景已经从简单的商品和服务扩展到广泛的社会和行业。当前&#xff0c;世界各地都在努力通过技术推动经济增长。对于许多行业来说&#xff0c;物联网技术的应用无疑将是一个新的增长机会。同时&#xff0c;物联网将推动社会结构从“制造…

Red Hat Linux 命令Crontab的使用方法

Red Hat Linux 命令Crontab的使用方法1 cron是一个linux下的定时执行工具&#xff0c;可以在无需人工干预的情况下运行作业。由于Cron 是Linux的内置服务&#xff0c;但它不自动起来&#xff0c;可以用以下的方法启动、关闭这个服务: /sbin/service crond start //启动服务 /…

C++的三大特性之继承

目录 一 继承的概念 代码&#xff1a; 总结&#xff1a; 二 继承中的关系 三 继承中的作用域问题 什么是域&#xff1f; 隐藏&#xff1a; 隐藏的场景&#xff1a; 总结 四 赋值兼容原则 什么是赋值兼容原则&#xff1f; 与平时强制类型转换的区别 这一个赋值兼容原则…

编译原理学习笔记18——语义分析和中间代码生成3

编译原理学习笔记18——语义分析和中间代码生成318.1 布尔表达式及其计算18.2 按数值表示法翻译布尔表达式18.3 带优化翻译布尔表达式18.1 布尔表达式及其计算 布尔表达式及其用途 计算布尔表达式的两种方法 计算布尔表达式的两种方法 18.2 按数值表示法翻译布尔表达式 数…

toString()、String.valueOf、(String)强转,有啥区别?

TOC 首先我们看这三头货&#xff0c;什么toString()、String.valueOf、(String)强转&#xff1f;有啥区别&#xff1f;就问你是不是很像&#xff0c;是不是都有一个String&#xff1f; 说白了&#xff0c;这三个都是将XX给变成String&#xff0c;简称变身String的方法 接下来一…

IDEA maven使用详解

前提 确保本地安装了maven 以一个模块工程为例&#xff0c;内部包含了许多maven项目 生命周期 这是全部的生命周期 其中&#xff0c;常用的生命周期的各个功能为&#xff1a; (clean生命周期)mvn clean清理target (default生命周期①)mvn validate验证项目为maven项目&a…

自然语言处理的进阶之路

1、隐马尔可夫链路一般较短原因 连乘链路太长&#xff0c;会导致数据稀疏&#xff0c;零频词太多 2、零频问题的一般解决方案 平滑/回退/差值 当n设置较小时&#xff0c;仍然会存在oov问题&#xff08;语料中未出现的词&#xff09; 2.1、平滑 2.1.1、加1平滑/拉普拉斯平…

Maven初级(一)

目录 一. Maven概述 1.1 Maven是什么 1.2 Maven的作用 1.2.1 项目构建 1.2.2 依赖管理 1.2.3 统一项目结构 1.3 Maven模型 1.3.1 插件 1.3.2 项目对象模型 1.3.3 依赖管理模型 二. Maven基础概念 2.1 仓库&#xff1a; 2.2 仓库分类 2.2.2 远程仓库(私服) 中央仓…

Python继承的优缺点

推出继承的初衷是让新手顺利使用只有专家才能设计出来的框架&#xff01;子类化内置类型的问题在Python2.2之前&#xff0c;内置类型不能子类化&#xff0c;如list、dict等。在Python2.2之后&#xff0c;内置类型可以子类化了&#xff0c;但是要注意的是&#xff1a;内置类型&a…

Individual tree segmentation and tree-counting using supervised clustering

ABSTRACT 个体树木分割 (ITS) 或树木计数是精准林业和农业过程中的一项基础工作。与费时费力的人工检查不同&#xff0c;计算机视觉在基于无人机 (UAV) 的应用中显示出巨大的前景&#xff1b;此类应用之一包括森林资源清单中的自动树木计数问题。然而&#xff0c;由于树冠冠层…

深度学习性能评估指标介绍

首先是相关数据描述。假设原始样本中有两类数据&#xff0c;其中&#xff1a;总共有P个类别为1的样本&#xff0c;假设类别1为正例总共有N个类别为0的样本&#xff0c;假设类别0为负例经过分类后&#xff1a;有TP个类别为1的样本被系统正确判定为类别1&#xff0c;FN个类别为1的…

【哈希表】leetcode1. 两数之和(C/C++/Java/Python/Js)

leetcode1. 两数之和1 题目2 思路3 代码3.1 C版本3.2 C版本3.3 Java版本3.4 Python版本3.5 JavaScript版本4 总结1 题目 题源链接 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数…

iPad 屏幕镜像到 macbook

将iPad 到屏幕投屏到 macbook&#xff0c;只需要三步就可以实现用数据线连接ipad和macbook在macbook的应用中找到QuickTime Player&#xff0c;打开QuickTime Player&#xff0c;在【文件】中选择【新建影片】在弹出窗口的小箭头中&#xff0c;选择需要的iPad名称通过数据线连接…

目标跟踪心得篇七:解决目标跟踪评价指标输出为0或异常(Trackeval、MMtracking)

如果在做跟踪任务测评时,发现输出的评价指标全为0或者异常值时该怎么办(如下图)?博主调试了很久发现其实这是MMtracking的一个Bug,因此如果不是用MMtracking框架的话本节可能对你帮助不大。 大致有以下两个内容: TrackEval目前还不能做到对多类别的MOT任务计算评价指标,…

FDD与TDD

TDD&#xff0c;时分双工(Time Division Duplexing) FDD&#xff0c;频分双工(Frequency Division Duplexing) 帮助理解&#xff1a; 1.FDD&#xff1a;双车道&#xff0c;一个车道只能走一个方向&#xff0c;双向互不干扰。 2.TDD&#xff1a;单车道&#xff0c;不同时间允…