springboot + aop 实战

66 阅读2分钟

spring中aop思想在业务中经常使用,目前我接触到的使用场景,主要是开发aop注解,给方法前后打印日志,或者审计日志,校验用户信息,检查权限等!使用场景不再赘述,这里表述的重点是 aop注解开发, 本人自知能力一般,要是有说的不对的地方,请各位大佬批评指正!

AOP介绍

在开始前,我将简单介绍AOP的一些概念,如果你对这些概念完全陌生,建议先上网了解相关概念,再继续阅读。

AOP,面向切面编程,即Aspect Oriented Programming。

  • Aspect:切面,类似于Java中的类声明,是对系统中横跨多个类的关注点进行模块化封装
  • Joinpoint:连接点,程序执行过程中的一个“点”,例如:方法的执行或异常的处理。在Spring AOP中,一个连接点总是代表一个方法的执行。
  • Pointcut:切入点,即一组连接点的集合;
  • Advice:通知,定义了将会织入到 Joinpoint 的具体逻辑,通过@Before、@After、@Around等注解来区别在JointPoint之前、之后等位置执行代码
  • Weaving:织入,织入指的是将Advice连接到Pointcut指定的Joinpoint处的过程
  • Interceptor:拦截器,是一种实现Advice(通知)的方式;
  • Target:目标对象,即符合切入点所指定的条件被织入Advice的对象。

以上术语,你可能会感到些许困惑,不过没关系,我们开始进入到正式的Coding,一步一步实现功能后,再回来此部分看这些概念,就会豁然开朗。

引入依赖

以SpringBoot为例,首先我们从Maven中央仓库引入AOP所需的依赖。在你的pom.xml中添加以下代码:

        <!-- SpringBoot AOP依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

一般都会引入spirng-boot-starter-web,已经包含aop依赖,不需要再单独引入。

定义注解

定义注解目的在于:之后需要打印日志的地方,只需要@Log("模块名称","业务类型")即可。


我们使用IDEA右键->New->Java Class->Annotation,文件名为Log.java。代码片段如下:

**


@Target({ ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {

    /**
     * 模块名称
     */
    public String moduleName() default "";

    /**
     * 业务类型
     */
    public int businessType() default BusinessType.OTHER; 
    //此处业务类型可以自己定义,完整代码可参考文末本仓库Github
}

在Log注解中,我们定义了注解能接收的两个参数:模块名称、业务类型。并将Target目标指定为METHOD方法,即方法注解。

@Retention(RetentionPolicy.RUNTIME)表明此注解不仅被保存到class文件中,在JVM加载class文件之后,此注解仍然存在。