springAOP的理解和具体实现

AOP:Aspect-OrientedProgramming 面向切面编程。其实是对OOP(面向对象编程)的补充和完善

简单点描述就是OOP有些事做起来很麻烦,很不方便,而利用AOP是可以很快很便捷的处理。

OOP引入封装、继承、多态等概念去公共对象的处理。但对于公共行为的时候就不好弄。此时就衍生出AOP。

比如对于统一日志的记录、授权校验都是可以使用AOP很好的处理。

AOP的主要优点:1、集中处理某一类问题;2、降低相同的代码出现在不同的地方,降低模块间的耦合。

AOP常见的场景:1、用户登录和鉴权;2、统一日志记录;3、统一执行时间统计;4、统一的返回格式设置;5、统一的一场处理;6、事务的开启和提交。

 AOP主要由哪些组成:

切面、切点、通知、连接点。

具体实现步骤;

1、引入依赖

 2、demo类

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

@Aspect
@Component
public class AopDemo {
    @Pointcut("execution(* org.ongoal.tun.demos.web.DeviceController.*(..))")
    public void pointCut(){
    }

    @Before("pointCut()")
    public void doBefore(){
        System.out.println("执行前置通知:" + LocalDateTime.now());
    }

    @After("pointCut()")
    public void doAfter(){
        System.out.println("执行后置通知:" + LocalDateTime.now());
    }

    @Around("pointCut()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("开始执行环绕通知:");
        Object proceed = joinPoint.proceed();
        System.out.println("结束环绕通知");
        return proceed;
    }

}

 

 

从打印的结果也能知道,每个通知执行的顺序也不一样,触发的时间段不一样。

 

AOP的的底层实现是动态代理,spring动态代理由两种技术实现:1、JDK动态代理;2、CGLib代理;

1、JDK动态代理:通过Java提供的java.lang.reflect.Proxy类创建代理对象,要求目标类至少是一个接口,通过接口代理对象。简单点说就是代理对象通过调用相同的接口去出发代理器。JDK动态代理底层是利用反射实现的。   重点:接口、反射。

2、CGLib动态代理:对于没有接口的目标类,使用CGLib来创建代理对象,会生成目标类的子类作为代理,在方法的前后插入切面逻辑,CGLib底层是字节码框架ASM实现的。   重点:继承(目标类不能用final修饰的类),ASM

无论是哪种代理方法,其本质都是代理对象去调用原对象的方法,那如何去调用呢,可以通过接口的实现类的方法调用到接口的方法(JDK动态代理),或者通过子类去调用父类的方法(CGLib代理)。

 

posted @ 2024-02-01 11:18  多多指教~  阅读(2)  评论(0编辑  收藏  举报