Spring的AOP实现日志管理操作

    xiaoxiao2025-08-10  6

    关于这个aop,有时候面试官会经常问道这类的问题,比如说,你使用aop来实现日志管理,那么你的aop实现的时候,怎么来获取到你要的参数,如何还有你现在执行的操作命令?

    今天就对这个问题进行测试解答。

    文章声明:此文章仅供测试,如有功能不全请谅解。

    读者最好对通知类,切入点、连接点自己有一个了解,否则会理解上比较麻烦。

    在文章后面我会对这里面的原理流程给大家详细解释,希望让更多的人懂。

    案例基于SSH进行的测试,但是aop的使用,在哪里使用都是一样的。SSH的部署不会的话可以参照:SSH整合

    1、在po类创建我们的实体类和hibernate.hbm.xml

    这个在SSH整合已经介绍了,就不多少了。

    2、业务层我们就只使用find()和add()两个功能,用来我们的测试。

    public interface UserService { public void add(User user); public List<User> find();}

    3、现在我们来写我们的action类

     

    package com.mepapa.action; import java.util.List; import javax.annotation.Resource; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import com.mepapa.po.User; import com.mepapa.service.UserService; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ModelDriven; @Controller("userAction") @Scope("prototype") public class UserAction implements ModelDriven<User>{ private User user; @Resource(name="userService") private UserService userService; //切入点 public String add(){ userService.add(user); return "list"; } //切入点 public String list(){ List<User> find = userService.find(); ActionContext.getContext().put("list", find); return "listUI"; } //切入点 public String addUser(){ return "addUI"; } @Override public User getModel() { if(user == null) user = new User(); return user; } }

     

    4、再就是我们进行切面变成的通知类

    package com.mepapa.aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; @Component @Aspect public class LogAop { //切入点的路径 @Pointcut(value="execution(* com.mepapa.service.UserServiceImpl.*(..))") public void method(){} //通知 @Before("LogAop.method()") public void startLog(JoinPoint jp){//这就是获取我们的参数了 //获取参数 Object[] args = jp.getArgs(); for (Object object : args) { System.out.println("日志--"+object); } //jp.getSignature().getName()获取相应的方法名 //通过方法名的不同执行相应的操作,这里就不具体执行了 String name = null; if(args!=null ) name = args[0].toString(); System.out.println("方法名"+jp.getSignature().getName()+"人员信息"+name); } @AfterReturning("LogAop.method()") public void endLog(){ System.out.println("保存日志成功"); } @AfterThrowing("LogAop.method()") public void errorLog(){ System.out.println("添加用户失败"); } }

    5、在通知类我们可以执行我们的日志存储啊,人员,操作我们都可以获取到了。

     

    希望大家能得到一些启发。

    流程:前台数据我们进行提交数据,我们简单的举一个例子,就比如说我们上面这个例子的add()操作。

       前台注册,将用户名和密码(这里注册的数据就不说了,以用户名和密码两个作为讲解)正确提交到了后台,后台的action方法add()这里是切入点,

    我们的通知类在这里有进行拦截,并通过我们的参数pointcut(在通知类的注解)进行拦截,获取到了进入add()方法的参数名,及里面的数据,再通知类里面执行我们的日志管理,当让也可以在执行完add()的方法后,再执行日志操作,具体看你的需求。

    @afterReturnning 是正确返回数值要进行的操作

    @afterThrowing是异常要进行的操作

    本篇文章,主要是帮助大家了解AOP,更加深入的明白AOP在哪里使用,如何使用, 如何传递参数,如何获取现在正在执行的操作名称。

    感谢对我的博客的关注。我也希望帮助更多的人,少走一些弯路,以后还会出一些很实际的问题解决方案,或者学习教程。

    转载请注明原文地址: https://ju.6miu.com/read-1301588.html
    最新回复(0)