用aop实现登陆日志、和操作日志持久化

用aop实现登陆日志、和操作日志持久化

在 Java 中,可以使用 **AOP(Aspect-Oriented Programming)**来实现登录日志和操作日志的持久化功能。通过 AOP,我们可以将日志记录这类 **横切关注点(cross-cutting concerns)**从业务逻辑中分离出来,实现更好的代码结构和可维护性。下面是一个简单的示例代码,演示如何使用 AOP 在登录和操作时记录日志并将日志持久化到数据库中。

假设我们有一个 UserService 类处理用户登录相关的操作,我们希望在用户登录成功或者进行操作时记录日志并将日志持久化到数据库中。

  1. 定义日志实体类

    public class Log {
        private String username;
        private String action;
        private Date timestamp;
    
        // 省略构造函数和getter/setter方法
    }
    
  2. 定义日志记录切面

    @Aspect
    @Component
    public class LogAspect {
    
        private final Logger logger = LoggerFactory.getLogger(LogAspect.class);
    
        @Autowired
        private LogRepository logRepository;
    
        @Around("execution(* com.example.UserService.login(..))")
        public Object logLogin(ProceedingJoinPoint joinPoint) throws Throwable {
            Object result = joinPoint.proceed();
            
            Log log = new Log();
            log.setUsername((String) joinPoint.getArgs()[0]);
            log.setAction("User login");
            log.setTimestamp(new Date());
            
            logRepository.save(log);
            
            return result;
        }
    
        @Around("execution(* com.example.UserService.*(..)) && !execution(* com.example.UserService.login(..))")
        public Object logOperation(ProceedingJoinPoint joinPoint) throws Throwable {
            Object result = joinPoint.proceed();
            
            Log log = new Log();
            log.setUsername("admin"); // 可以根据实际情况获取当前操作用户
            log.setAction("User operation: " + joinPoint.getSignature().getName());
            log.setTimestamp(new Date());
            
            logRepository.save(log);
            
            return result;
        }
    }
    
  3. 定义日志持久化 Repository

    @Repository
    public interface LogRepository extends JpaRepository<Log, Long> {
        // 可以自定义需要的持久化操作
    }
    
  4. 在配置类中启用 AOP

    @Repository
    public interface LogRepository extends JpaRepository<Log, Long> {
        // 可以自定义需要的持久化操作
    }
    

    在以上示例中,我们定义了一个 LogAspect 切面类,通过 @Around 注解拦截了 UserService 类中的 login 方法和其他操作方法,并在切面中记录日志,并通过 LogRepository 将日志持久化到数据库中。通过 AOP 的方式,我们实现了登录日志和操作日志的持久化功能,使得这部分代码与业务逻辑相分离,提高了代码的可维护性和扩展性。

  5. AOP常用注解

    在 Spring 框架中,用于支持 AOP(Aspect-Oriented Programming)的主要注解包括:

    1. @Aspect:用于定义一个切面(Aspect),标识一个类为切面,在其中定义通知和切点。
    2. @Before:前置通知,在目标方法执行前执行。
    3. @After:后置通知,在目标方法执行后执行。
    4. @Around:环绕通知,在目标方法执行前后都可以执行自定义的行为。
    5. @AfterReturning:返回通知,在目标方法成功执行后执行。
    6. @AfterThrowing:异常通知,在目标方法抛出异常时执行。
    7. @Pointcut:定义切点,可以重复使用的切点表达式。
    8. @DeclareParents:引入增强,允许向现有的类添加新的方法和属性。
  • 14
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值