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类
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在哪里使用,如何使用, 如何传递参数,如何获取现在正在执行的操作名称。
欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/)
Powered by Discuz! X3.2