You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Service Impl类的addMoneyToWallet()方法实现Before通知逻辑

实现Spring AOP Before通知记录方法执行时间

1. 确认依赖(Spring Boot场景)

如果是Spring Boot项目,先确保引入AOP starter依赖:
Maven(pom.xml):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

Gradle对应添加依赖即可。

2. 你的Service Impl类示例

假设你的业务实现类结构如下:

import org.springframework.stereotype.Service;
import java.math.BigDecimal;

@Service
public class WalletServiceImpl {
    public void addMoneyToWallet(Long userId, BigDecimal amount) {
        // 实际的钱包加钱业务逻辑
        System.out.println("为用户" + userId + "充值:" + amount + "元");
    }
}

3. 编写切面类实现Before通知

这是核心实现,通过注解将类声明为Spring Bean和切面,同时定义切入点与通知逻辑:

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Aspect
@Component
public class WalletOperationLogAspect {
    // 初始化日志实例
    private static final Logger logger = LoggerFactory.getLogger(WalletOperationLogAspect.class);
    // 定义日期格式化规则
    private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");

    // 定义切入点:精准匹配WalletServiceImpl的addMoneyToWallet方法
    @Pointcut("execution(* com.your.package.service.impl.WalletServiceImpl.addMoneyToWallet(..))")
    public void addMoneyOperation() {}

    // Before通知:在切入点方法执行前触发
    @Before("addMoneyOperation()")
    public void logBeforeAddMoney() {
        String currentTime = LocalDateTime.now().format(TIME_FORMATTER);
        logger.info("准备执行addMoneyToWallet方法,当前时间:{}", currentTime);
    }
}

关键细节说明

  • @Aspect:标记当前类为AOP切面类
  • @Component:将切面类纳入Spring容器管理,成为Bean
  • 切入点表达式execution(* com.your.package.service.impl.WalletServiceImpl.addMoneyToWallet(..)):
    • * 表示匹配任意返回值类型
    • com.your.package.service.impl 替换为你实际的ServiceImpl所在包路径
    • (..) 表示匹配任意数量、任意类型的方法参数
  • 日志输出使用SLF4J标准Logger,避免直接依赖具体日志实现

执行效果

当调用WalletServiceImpl.addMoneyToWallet()方法时,控制台会先输出INFO级别的时间日志,再执行业务逻辑:

2024-05-20 15:42:30.456  INFO 9876 --- [main] c.y.p.s.i.WalletOperationLogAspect       : 准备执行addMoneyToWallet方法,当前时间:2024-05-20 15:42:30.456
为用户1002充值:200.00元

内容的提问来源于stack exchange,提问作者Maria Torp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 18:42:45