SpringBoot AOP

AOP是一种编程范式,用于将关注点分离,核心业务与周边功能独立开发。通过SpringBoot的AOP支持,可以使用注解如@Aspect、@Before等定义切面和通知。切面逻辑示例中展示了如何记录方法的执行时间。注意,AOP不代理内部方法的自调用和final方法,且基于动态代理,无接口时使用CGLIB。
摘要由CSDN通过智能技术生成

概念

AOP 即 Aspect Oriented Program 面向切面编程
首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能,核心业务功能和切面功能分别独立进行开发,然后把切面功能和核心业务功能 “编织” 在一起,这就叫AOP.
如果没有aop,只能通过继承类和实现接口.使代码的耦合度增强;
Aop存在的目的就是为解耦;

具体编码步骤

maven依赖
  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
注解:
  1. @ASpect 申明这是一个切面
  2. @Before @After @Around @AfterReturning @AfterThrowing 定义Advice,这些注解内的参数可以定义拦截规则;
  3. @PointCut定义拦截规则
  4. 多个切面同时存在时可以使用@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动态代理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值