当前位置: 首页 > news >正文

Spring AOP面向切面编程实现日志功能

首先我们引入日志slf4j相关依赖


    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>2.0.9</version> 
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-slf4j2-impl</artifactId>
      <version>2.20.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>2.20.0</version>
    </dependency>

再引入spring-aop依赖

	<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>5.3.23</version>
    </dependency>

为了方便编码,lombok也是必不可少的

	<dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.34</version>
      <scope>provided</scope>
    </dependency>

我们创建以下类,就能用切面对user相关的功能进行权限控制

@Aspect
@Component
public class UserAspect {

    private static final Logger logger = LoggerFactory.getLogger(UserAspect.class);


    private UserCache cache;

    public UserAspect(UserCache cache) {
        this.cache = cache;
    }


    @After("execution(* com.homework.UserServiceImpl.*(..))")
    public void logMethodAccess(JoinPoint joinPoint) {
        String methodName = joinPoint.getSignature().getName();
        Object[] args = joinPoint.getArgs();

        logger.debug("方法名: {}, 参数: {}", methodName, args);
    }


    @Around("execution(* com.homework.UserServiceImpl.addUser(..)) || " +
            "execution(* com.homework.UserServiceImpl.deleteUser(..))")
    public Object checkPermission(ProceedingJoinPoint joinPoint) throws Throwable {

        if (!"admin".equals(cache.getUserName())) {
            logger.warn("权限不足: 当前用户 {} 无法执行 {}", cache.getUserName(), joinPoint.getSignature().getName());
            return false;
        }

        return joinPoint.proceed();
    }
}

其中@After和@Before注释的方法可以看作是execution里的方法的前置操作以及后置操作,无论是否有异常都会进行,无法控制中间方法的进行与否。
三者的主要功能如下
@After可以进行资源释放、日志记录等功能
@Before可以进行参数校验、日志记录等功能
@Around方法会完全控制目标方法,可以进行权限检查、性能监控、事务管理等功能
如果需要完全控制目标方法的执行,使用 @Around
如果只需要在目标方法执行前或后做一些操作,使用 @Before或 @After
其中@Around方法的传入参数是ProceedingJoinPoint,这个方法和其它两种注解的传入参数的最大区别就是它会控制进程,只有返回 joinPoint.proceed() 了才会让这个方法继续进行,否则将会直接停止,而其它两种方法的返回值是 void 它们无法影响到方法的执行与停止。

相关文章:

  • 第 五 章:优化算法_《C++性能优化指南》_notes
  • 在 CentOS 系统中开机自动执行 Shell 脚本
  • vue vue3 走马灯Carousel
  • 正则表达式-万能表达式
  • (二)手眼标定——概述+原理+常用方法汇总+代码实战(C++)
  • 第三章:测量性能_《C++性能优化指南》_notes
  • 可以把后端的api理解为一个目录地址,但并不准确
  • MQTT协议笔记
  • AI之山,鸿蒙之水,画一幅未来之家
  • 网络之数据链路层
  • 【赵渝强老师】Oracle数据库的客户端工具
  • python爬虫WASM
  • 大模型工作原理深度解剖:从Transformer架构到知识涌现的范式革命
  • 全息教学系统的软件开发,沉浸式数字沙盘展示系统如何改变历史教学
  • 蓝桥与力扣刷题(蓝桥 蓝桥骑士)
  • 腾讯滑块验证码自动分析工具:原理与实现
  • 《TypeScript 7天速成系列》第3天:TypeScript高级类型通关秘籍:泛型+联合+交叉类型实战
  • 【react】类组件和函数组件的区别
  • Xshell能连接远程服务器,vscode连接远程服务器一直让输入密码,连不上
  • 炫酷的3D卡片翻转画廊实现教程
  • 亮剑浦江丨上海网信部门处罚一批医疗服务类互联网企业,三大类问题值得关注
  • 外交部:欢迎外国朋友“五一”来中国
  • 报告显示2024年全球军费开支增幅达冷战后最大
  • 广州海关原党委委员、副关长刘小威被开除党籍
  • 在县中,我看到“走出去”的渴望与“留下来”的惯性
  • 解码人格拼图:探索心理健康的多维视角