概念
AOP 即 Aspect Oriented Program 面向切面编程
首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能,核心业务功能和切面功能分别独立进行开发,然后把切面功能和核心业务功能 “编织” 在一起,这就叫AOP.
如果没有aop,只能通过继承类和实现接口.使代码的耦合度增强;
Aop存在的目的就是为解耦;
具体编码步骤
maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
注解:
- @ASpect 申明这是一个切面
- @Before @After @Around @AfterReturning @AfterThrowing 定义Advice,这些注解内的参数可以定义拦截规则;
- @PointCut定义拦截规则
- 多个切面同时存在时可以使用@Order制定切面执行的顺序,小的先执行
eg:
切面注解
import java.lang.annotation.*;
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface LogConsumerTime {
String value() default "";
}
切面逻辑
@Aspect
@Configuration
@Slf4j
public class AopConfigure{
@Around("@within(param)||@annotation(param)")
@Order(1)
public Object logTimePointAround(ProceedingJoinPoint joinPoint, LogConsumerTime param) throws Throwable {
LogConsumerTime a = getAnnotatiom(joinPoint, param);
log.info("around exec {},value:{}", joinPoint.getSignature().getName(), a.value());
StopWatch watch = new StopWatch();
watch.start();
Object res = joinPoint.proceed();
watch.stop();
log.info("consume time is :{} ms", watch.getLastTaskTimeMillis());
return res;
}
}
避坑
内部方法的自调用不会代理,final修饰的方法不会代理,
AOP增强的本质是jdk的动态代理, 如果没有接口就会用CGLIB动态代理