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文件之后,此注解仍然存在。