博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring之AOP
阅读量:5894 次
发布时间:2019-06-19

本文共 3316 字,大约阅读时间需要 11 分钟。

  hot3.png

AOP简介

关于AOP的应用,在日志记录和异常处理时非常常见,举个简单的例子,我们有一个函数,是一段业务逻辑,那我们怎么知道这个函数执行的时候有没有异常或者它的参数是多少,有的人说了,这还不简单,写个LOG不就行了吗,但在一堆逻辑代码中插入许多这样的LOG语句,总是不够好,咱们代码讲究的是高內聚,低耦合,那么AOP就是来解决这些事情的:

  

这张图绿色部分是我们的业务逻辑,那AOP就负责把红色部分和黄色部分插入到绿色部分当中,最后形成中间那一块的效果。

主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。

AOP应用

关于AOP的应用说白了就是各种通知:

  1. 前置通知;

  2. 后置通知;

  3. 环绕通知;

  4. 返回通知;

  5. 异常通知;

那我们经常用到的有前置通知,后置通知和异常通知,下面是一个demo:

在我们创建了StudentService,这是一个Interface:

public interface StudentService {    public void addStudent(String name);}

然后创建StudentServiceImp,实现了StudentService:

public class StudentServiceImp implements StudentService{    @Override    public void addStudent(String name) {        System.out.println("我要添加学生" + name);    }}

那现在我们要做的就是在执行addStudent函数前后,都要有log日志,但是这个函数的代码不能动了,这时候就要用到Spring之AOP了。

首先创建一个Aspect:

public class StudentServiceAspect{    public void doBefore(JoinPoint jp){        System.out.println(jp.getTarget().getClass().getName() +  "在执行方法" + jp.getSignature().getName() + "前," + "参数为:" + jp.getArgs()[0]);    }    public void doAfter(JoinPoint jp){        System.out.println(jp.getTarget().getClass().getName() +  "在执行方法" + jp.getSignature().getName() + "后," + "参数为:" + jp.getArgs()[0]);    }}

然后在spring的配置文件中写入了这个aspect,然后进行配置:

    
    
    
        
            
            
            
            

最后测试:

public class T {    private ApplicationContext applicationContext;    @Before    public void setUp() throws Exception {        applicationContext = new ClassPathXmlApplicationContext("spring_config.xml");    }    @Test    public void test() {        StudentService student = (StudentService) applicationContext.getBean("studentService");        student.addStudent("张三");    }}

控制台输出:

com.gefufeng.service.imp.StudentServiceImp在执行方法addStudent前,参数为:张三com.gefufeng.service.imp.StudentServiceImp在执行方法addStudent后,参数为:张三

然后是异常处理:

在StudentServiceAspect中多加一个函数:

public class StudentServiceAspect{    public void doBefore(JoinPoint jp){        System.out.println(jp.getTarget().getClass().getName() +  "在执行方法" + jp.getSignature().getName() + "前," + "参数为:" + jp.getArgs()[0]);    }    public void doAfter(JoinPoint jp){        System.out.println(jp.getTarget().getClass().getName() +  "在执行方法" + jp.getSignature().getName() + "后," + "参数为:" + jp.getArgs()[0]);    }    public void doAfterThrowing(JoinPoint jp,Exception ex){        System.out.println(jp.getTarget().getClass().getName() +  "在执行方法" + jp.getSignature().getName() + "时," + "参数为:" + jp.getArgs()[0] + ",有异常,异常为:" + ex.getMessage());    }}

然后配置文件中:

    
    
    
        
            
            
            
            
            

在StudentServiceImp中写一个异常

public class StudentServiceImp implements StudentService{    @Override    public void addStudent(String name) {        System.out.println(1/0);        System.out.println("我要添加学生" + name);    }}

然后测试,控制台输出:

com.gefufeng.service.imp.StudentServiceImp在执行方法addStudent前,参数为:张三com.gefufeng.service.imp.StudentServiceImp在执行方法addStudent后,参数为:张三com.gefufeng.service.imp.StudentServiceImp在执行方法addStudent时,参数为:张三,有异常,异常为:/ by zero

以上就是AOP的应用

转载于:https://my.oschina.net/gef/blog/645894

你可能感兴趣的文章
redis通过pipeline提升吞吐量
查看>>
[20180321]toad下execute as script的fetch
查看>>
以云到端创新变革医疗健康服务模式
查看>>
2016中国大数据大会暨大数据年度盛典将于12月20日在京举办
查看>>
移动开发工具推荐
查看>>
汽车市场将是嵌入式视觉应用最有潜力发展领域
查看>>
关于“AI是不是胡扯”之争:这是中国科技圈的胜利
查看>>
Android Design Support Library全解:Part 2 Snackbar
查看>>
上帝掷骰子吗?量子物理史话-序篇
查看>>
购买视觉智能相机必须要问清楚10个问题
查看>>
Mac下安装JDK(Mac 10.12)
查看>>
Linux下tmp文件夹的文件自动删除的问题(转)
查看>>
2016亚太智慧城市发展高峰论坛成功召开
查看>>
Hexo 博客的管理
查看>>
企业闪存应用八年回顾
查看>>
阿里云首次亮相国际顶级数据库学术会议ICDE
查看>>
今天心情不太开心
查看>>
Windows Server 2012及以上安装IIS的步骤
查看>>
html5+css3实现手机toast提示
查看>>
硬币量子力学
查看>>