51Testing软件测试论坛

标题: Spring的AOP实现日志管理操作 [打印本页]

作者: 测试积点老人    时间: 2018-12-12 15:00
标题: 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类
  1. package com.mepapa.action;
  2. import java.util.List;
  3. import javax.annotation.Resource;
  4. import org.springframework.context.annotation.Scope;
  5. import org.springframework.stereotype.Controller;
  6. import com.mepapa.po.User;
  7. import com.mepapa.service.UserService;
  8. import com.opensymphony.xwork2.ActionContext;
  9. import com.opensymphony.xwork2.ModelDriven;
  10. @Controller("userAction")
  11. @Scope("prototype")
  12. public class UserAction implements ModelDriven<User>{
  13.         private User user;
  14.         
  15.         @Resource(name="userService")
  16.         private UserService userService;        
  17.         //切入点
  18.         public String add(){
  19.                 userService.add(user);
  20.                 return "list";
  21.         }
  22.         //切入点
  23.         public String list(){
  24.                 List<User> find = userService.find();
  25.                 ActionContext.getContext().put("list", find);
  26.                 return "listUI";
  27.         }
  28.         //切入点
  29.         public String addUser(){
  30.                 return "addUI";
  31.         }
  32.         
  33.         @Override
  34.         public User getModel() {
  35.                 if(user == null)
  36.                         user = new User();
  37.                 return user;
  38.         }
  39. }
复制代码

4、再就是我们进行切面变成的通知类
  1. package com.mepapa.aop;
  2. import org.aspectj.lang.JoinPoint;
  3. import org.aspectj.lang.annotation.AfterReturning;
  4. import org.aspectj.lang.annotation.AfterThrowing;
  5. import org.aspectj.lang.annotation.Aspect;
  6. import org.aspectj.lang.annotation.Before;
  7. import org.aspectj.lang.annotation.Pointcut;
  8. import org.springframework.stereotype.Component;
  9. @Component
  10. @Aspect
  11. public class LogAop {
  12.         //切入点的路径
  13.         @Pointcut(value="execution(* com.mepapa.service.UserServiceImpl.*(..))")
  14.         public void method(){}
  15.         //通知
  16.         @Before("LogAop.method()")
  17.         public void startLog(JoinPoint jp){//这就是获取我们的参数了               
  18.                 //获取参数
  19.                 Object[] args = jp.getArgs();
  20.                 for (Object object : args) {
  21.                         System.out.println("日志--"+object);
  22.                 }
  23.                 //jp.getSignature().getName()获取相应的方法名
  24.                 //通过方法名的不同执行相应的操作,这里就不具体执行了
  25.                 String name = null;
  26.                 if(args!=null ) name = args[0].toString();
  27.                 System.out.println("方法名"+jp.getSignature().getName()+"人员信息"+name);
  28.         }        
  29.         
  30.         @AfterReturning("LogAop.method()")
  31.         public void endLog(){
  32.                 System.out.println("保存日志成功");
  33.         }
  34.         
  35.         @AfterThrowing("LogAop.method()")
  36.         public void errorLog(){
  37.                 System.out.println("添加用户失败");
  38.         }        
  39. }
复制代码

5、在通知类我们可以执行我们的日志存储啊,人员,操作我们都可以获取到了。希望大家能得到一些启发。
流程:前台数据我们进行提交数据,我们简单的举一个例子,就比如说我们上面这个例子的add()操作。

前台注册,将用户名和密码(这里注册的数据就不说了,以用户名和密码两个作为讲解)正确提交到了后台,后台的action方法add()这里是切入点,我们的通知类在这里有进行拦截,并通过我们的参数pointcut(在通知类的注解)进行拦截,获取到了进入add()方法的参数名,及里面的数据,再通知类里面执行我们的日志管理,当让也可以在执行完add()的方法后,再执行日志操作,具体看你的需求。

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

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











欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2