使用 AOP 记录操作日志

简介: 使用 AOP 记录操作日志

AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,它可以将横切关注点(cross-cutting concerns)与核心业务逻辑分离开来,提高了代码的模块化和可维护性。在 Spring Boot 中,AOP 可以用于记录操作日志、权限控制、性能监控等方面。

 

下面我们来看一个使用 AOP 记录操作日志的案例。假设我们有一个简单的用户管理系统,其中包含用户的增删改查操作。我们希望在每次对用户进行操作时,都能记录下操作日志。

 

首先,我们需要创建一个用于记录日志的切面类,这个切面类需要实现日志记录的逻辑。接着,我们使用 AOP 的方式将这个切面类应用到用户管理的方法上。

 

```java
@Aspect
@Component
public class LogAspect {
 
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
 
    @Pointcut("execution(* com.example.demo.service.UserService.*(..))")
    public void pointcut() {}
 
    @Before("pointcut()")
    public void before(JoinPoint joinPoint) {
        String methodName = joinPoint.getSignature().getName();
        Object[] args = joinPoint.getArgs();
        logger.info("Before method: {} with arguments: {}", methodName, Arrays.toString(args));
    }
 
    @AfterReturning(pointcut = "pointcut()", returning = "result")
    public void afterReturning(JoinPoint joinPoint, Object result) {
        String methodName = joinPoint.getSignature().getName();
        logger.info("After method: {} with result: {}", methodName, result);
    }
}
```

 

在这个切面类中,我们定义了两个通知(Advice):`before` 和 `afterReturning`。`before` 通知在目标方法执行前执行,用于记录方法名称和参数;`afterReturning` 通知在目标方法执行并返回结果后执行,用于记录方法名称和返回结果。

 

接着,我们需要在 Spring Boot 应用程序的主类或配置类上添加 `@EnableAspectJAutoProxy` 注解,以启用 AOP 功能。

 

```java
@SpringBootApplication
@EnableAspectJAutoProxy
public class DemoApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
```

 

最后,我们可以在用户服务(`UserService`)中定义一些简单的增删改查方法,并在这些方法上应用刚刚定义的切面类。

```java
@Service
public class UserService {
 
    private List<User> users = new ArrayList<>();
 
    public List<User> getUsers() {
        return users;
    }
 
    public void addUser(User user) {
        users.add(user);
    }
 
    public void deleteUser(int userId) {
        users.removeIf(user -> user.getId() == userId);
    }
 
    public void updateUser(User user) {
        users.stream()
                .filter(u -> u.getId() == user.getId())
                .findFirst()
                .ifPresent(u -> {
                    u.setName(user.getName());
                    u.setAge(user.getAge());
                });
    }
 
    public User getUserById(int userId) {
        return users.stream()
                .filter(user -> user.getId() == userId)
                .findFirst()
                .orElse(null);
    }
}
```

 

这样,每次调用用户管理的方法时,都会触发切面类中定义的日志记录逻辑,从而实现了操作日志的记录。

 

在上面的例子中,我们使用了 `@Before` 和 `@AfterReturning` 这两种通知类型,分别在目标方法执行前和执行后执行。除了这两种通知类型外,AOP 还提供了其他几种通知类型,包括:

 

1. **@After**:在目标方法执行后(无论是否发生异常)执行。

2. **@Around**:包围目标方法执行,在方法执行前和执行后都可以添加逻辑。

3. **@AfterThrowing**:在目标方法抛出异常后执行。

 

这些通知类型可以根据实际需求选择合适的类型,并在切面类中进行相应的定义和处理。

 

另外,在实际应用中,我们还可以通过 AOP 实现更复杂的功能,如权限控制、性能监控、事务管理等。通过合理地使用 AOP,可以有效地提高代码的复用性和可维护性,提升系统的可靠性和稳定性。

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
SQL 监控 Java
在IDEA 、springboot中使用切面aop实现日志信息的记录到数据库
这篇文章介绍了如何在IDEA和Spring Boot中使用AOP技术实现日志信息的记录到数据库的详细步骤和代码示例。
在IDEA 、springboot中使用切面aop实现日志信息的记录到数据库
|
SQL Java Serverless
实时计算 Flink版操作报错合集之在写入SLS(Serverless Log Service)时出现报错,该如何排查
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
Java Spring
在Spring Boot中使用AOP实现日志切面
在Spring Boot中使用AOP实现日志切面
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
1192 8
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
405 1
|
Java Serverless 应用服务中间件
函数计算操作报错合集之JVM启动时找不到指定的日志目录,该如何解决
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
341 1
|
监控 数据管理 关系型数据库
数据管理DMS使用问题之是否支持将操作日志导出至阿里云日志服务(SLS)
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
|
监控 Java Spring
在Spring Boot中使用AOP实现日志记录
在Spring Boot中使用AOP实现日志记录
|
8月前
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
750 0
|
7月前
|
监控 Java Spring
AOP 切面编程
AOP(面向切面编程)通过动态代理在不修改源码的前提下,对方法进行增强。核心概念包括连接点、通知、切入点、切面和目标对象。常用于日志记录、权限校验、性能监控等场景,结合Spring AOP与@Aspect、@Pointcut等注解,实现灵活的横切逻辑管理。
1835 6
AOP 切面编程