测试积点老人 发表于 2018-12-12 15:00:42

Spring的AOP实现日志管理操作

本帖最后由 测试积点老人 于 2018-12-12 15:05 编辑

关于这个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.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在哪里使用,如何使用, 如何传递参数,如何获取现在正在执行的操作名称。






页: [1]
查看完整版本: Spring的AOP实现日志管理操作