TA的每日心情 | 无聊 昨天 09:06 |
---|
签到天数: 530 天 连续签到: 2 天 [LV.9]测试副司令
|
本帖最后由 测试积点老人 于 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在哪里使用,如何使用, 如何传递参数,如何获取现在正在执行的操作名称。
|
|