51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 1815|回复: 0
打印 上一主题 下一主题

Spring的AOP实现日志管理操作

[复制链接]
  • TA的每日心情
    无聊
    1 小时前
  • 签到天数: 403 天

    连续签到: 1 天

    [LV.9]测试副司令

    跳转到指定楼层
    1#
    发表于 2018-12-12 15:00:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 测试积点老人 于 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在哪里使用,如何使用, 如何传递参数,如何获取现在正在执行的操作名称。






    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-4-26 10:35 , Processed in 0.063518 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表