1、AOP简介
AOP即面向切面,主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。
通俗点讲就是提供一个为一个业务实现提供切面注入的机制,通过这种方式,在业务运行中将定义好的切面通过切入点绑定到业务中,以实现将一些特殊的逻辑绑定到此业务中。
比如,若是需要一个记录日志的功能,比如事务功能。
2、spring支持的通知类型
- 前置通知@before:在一个方法执行前被调用。可以获取目标对象 和 目标方法相关的信息
- 最终通知@after: 在方法执行之后调用的通知,无论方法执行是否成功。
- 后置通知@after-returning: 仅当方法成功完成后执行的通知。可以通过配置获取返回值
- 异常通知@after-throwing: 在方法抛出异常退出时执行的通知。
- 环绕通知@around: 在方法执行之前和之后调用的通知。
3、AOP的使用
a、导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
b、自定义注解
注:注解中定义的方法没有参数,且返回类型仅限于原始类型,字符串,枚举,注解或以上类型的集合
@Documented
@Retention(RetentionPolicy.RUNTIME) //作用周期:运行时有效
@Target(ElementType.METHOD) //作用范围:方法和类
public @interface MyAnnotation {
String[] value();
}
c、编写切面
@Aspect //声明切面注解
@Component
public class TestAspect {
/**
* 定义切点-->自定义注解方式(在需要使用切面的地方加上注解)
*/
@Pointcut("@annotation(com...aspect.MyAnnotation )")
public void afterAsperct(){
}
/**
* 具体在切点前面前或者后需要执行的流程,
* 在此只写了在切点前执行
* -->切点后执行的话 @After 相关的注解,
*/
@Before("afterAsperct()")
public void before(){
System.out.println("切面前执行-->");
}
}
d、在需要使用切面的接口或者方法上加上自定义的注解
@RestController
@RequestMapping("test")
public class TestController {
@MyAnnotation("可以自定义参数") //自定义的注解(加上后会执行切面)
@GetMapping("/test")
public String test(){
System.out.println("执行切面之后执行啦");
return "SUCCESS";
}
}