今天我们来讲解一下如何给springboot添加Aop,这个功能在开发中也是会被经常用到的。刨去事务不说,我们也会有很多地方需要自定义aop,例如用户登录信息和权限的获取以及jwt(json web token)签名验证等过程都需要我们使用到自定义aop,那就让我们来聊聊这个aop具体是做什么的以及具体怎么使用吧。

AOP简介

AOP(Aspect Oriented Programming)即面向切面编程, 它提供了另一种角度来思考程序结构,弥补了传统的OOP即面向对象编程的不足,AOP采取了横向抽取机制,取代了传统纵向继承体系重复性代码。

使用场景

在实际开发中,我们会有很多与我们业务逻辑无关但是又不得不写的代码,例如如果我们需要使用jwt签名验证我们需要在很多接口前都要进行签名的校验,根据签名的正确与否来决定是否拥有调用此接口的权利。如果我们在每一个接口前都进行这一系列的复杂校验,不仅会增加程序员的代码量,影响他们写业务逻辑的思路,也会造成代码的冗余,使同一功能代码书写多次。

AOP术语

想要使用AOP,则要对AOP的术语有一些了解。网上的AOP术语解释对于初学者而言个人感觉过于专业难懂。本人使用比较简单的语言对其进行了解释。
1.目标类(target):需要被增强的类。
2.连接点(JoinPoint):目标类上哪些有可能被增强的方法。(所有方法)
3.切入点(PointCut):目标类被增强的方法,被增强的连接点。
4.增强/通知(Advice):增强内容
5.织入(weaving):将通知(增强)应用到连接点上,生成代理的过程。
6.代理(proxy)
7.切面(aspect):切入点和 通知 结合

AOP通知类型

前置通知(Before advice): 在目标方法执行前实施增强
后置通知(After advice):在目标方法执行后实施增强
环绕通知(Around advice):在目标方法执行前后实施增强
异常抛出通知(After throwing advice):在方法抛出异常后实施增强
返回后通知(After returning advice):正常完成后执行的通知

AOP与SpringBoot结合

首先我们使用的架构还是基于之前写过的配置双数据源的架构,如果不了解的可以查看java 基于springboot使用ssh(spring + springmvc + hibernate)分库配置多数据源方式 这篇文章。

创建AOP类

java的aop的before java中aop_java

代码如下,对应代码解释以注释的形式添加到了代码中。
ControllerAOP

package com.beyondli.webtools;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.context.annotation.Configuration;

/**
 * Created by beyondLi on 2017/7/31.
 */
//证明是一个配置文件(使用@Component也可以,因为点入后会发现@Configuration还是使用了@Component)
@Configuration
//证明是一个切面
@Aspect
public class ControllerAOP {
    //环绕aop
    //execution表达式 此表达式表示扫描controller下所有类的所有方法都执行此aop
    @Around("execution (* com.beyondli.controller..*.*(..))")
    public Object testAop(ProceedingJoinPoint pro) throws Throwable {
        //获取request请求提(需要时备用)
        //HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        //进入方法前执行的代码
        System.out.println("beginAround");
        //执行调用的方法
        Object proceed = pro.proceed();
        //方法执行完成后执行的方法
        System.out.println("endAround");
        return proceed;
    }

}

测试结果

java的aop的before java中aop_aop_02


java的aop的before java中aop_aop_03


java的aop的before java中aop_springboot_04

好了,其实使用springboot添加aop还是非常容易的,具体的使用就要根据业务的具体需求做具体的改动了。

以上观点均属本人个人理解,如有错误或不足,望指出,共同成长。