首页 > 其他分享 >springAOP的理解和具体实现

springAOP的理解和具体实现

时间:2024-02-01 11:23:54浏览次数:17  
标签:JDK 代理 接口 理解 具体 CGLib AOP springAOP public

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代理)。

 

标签:JDK,代理,接口,理解,具体,CGLib,AOP,springAOP,public
From: https://www.cnblogs.com/qwg-/p/18000609

相关文章

  • 理解英特尔® 酷睿™ 处理器后缀含义
     外形/功能类型/细分市场后缀经优化/设计面向台式机K高性能,未锁频 Φ需要独立显卡 S特别版 T功耗优化生活方式 X/XE高性能,未锁频移动设备(笔记本电脑和2合1设备)HX最高性能,所有SKU未锁频......
  • [office] 如何理解Excel公式中的各种符号?
    Q:在Excel公式中,我们会使用各种符号连接数字、单元格或函数,从而获得想要的结果,例如,=SQRT((1234-234)/1)^2。能够总结一下这些符号的使用吗?A:下面是Excel公式中使用的常用符号及说明。+–*/基本的算术操作符:加、减、乘、除。例如,1+2,9-6,11*9,63/7,3+5*2%百分数值。例如,4/5%,结果为8。......
  • 卷积神经网络理解(4)
    1、CNN中常见的名词padding:padding(填充)参数的作用是决定在进行卷积或池化操作时,是否对输入的图像矩阵边缘补0stride:滑动卷积核时的步长stride(例如每次滑动一个或两个)kernal:卷积核,通常为3x3或者5x5filter:卷积核的数量(神经元的数量)。这个地方怎么理解呢,一个3x3的卷积核有9个参......
  • 深入理解Java引用类型
    深入理解Java引用类型在Java中类型可分为两大类:值类型与引用类型。值类型就是基本数据类型(如int,double等),而引用类型,是指除了基本的变量类型之外的所有类型(如通过class定义的类型)。所有的类型在内存中都会分配一定的存储空间(形参在使用的时候也会分配存储空间,方法调用......
  • [职场] 室内设计师助理具体是做什么的
    室内设计师助理是在室内设计师指导下提供协助的专业人员。他们负责辅助室内设计师完成各项工作,包括项目策划、材料采购、平面布置、图纸制作、施工监督等。一.工作内容1.参与项目策划会议,了解客户需求和预算限制;2.收集资料、调研市场,为设计师提供支持性建议;3.协助设计师进行平面布......
  • python中设置cudnn作用理解
     1、cudnn的简介cuDNN(CUDADeepNeuralNetworklibrary):是NVIDIA打造的针对深度神经网络的加速库,是一个用于深层神经网络的GPU加速库。如果你要用GPU训练模型,cuDNN不是必须的,但是一般会采用这个加速库。2、torch.backends.cudnn的理解 cuDNN使用非确定性算法,并且可以使用to......
  • 关于C# await的一点新理解
    关于await又理解深一点了,以前有点懵,原来await 是对Task.Run的一个修饰,叶节点,后续技节点是对标有async的方法进行串烧修饰,所以根在Task.Run这个方法要所以要理解await必须要详细查看Task.RunTask.Run是调用后直接把Run的参数委托丢线程池的然后不等待直接返回的,所以返回是一个Task......
  • 《深入理解计算机系统(原书第3版)》PDF
    内容简介本书从程序员的视角详细阐述计算机系统的本质概念,并展示这些概念如何实实在在地影响应用程序的正确性、性能和实用性。全书共12章,主要内容包括信息的表示和处理、程序的机器级表示、处理器体系结构、优化程序性能、存储器层次结构、链接、异常控制流、虚拟存储器、系统级I/......
  • 《深入理解计算机系统(原书第3版)》PDF
    内容简介本书从程序员的视角详细阐述计算机系统的本质概念,并展示这些概念如何实实在在地影响应用程序的正确性、性能和实用性。全书共12章,主要内容包括信息的表示和处理、程序的机器级表示、处理器体系结构、优化程序性能、存储器层次结构、链接、异常控制流、虚拟存储器、系统......
  • 深入理解Java双列结合Map
    在Java编程中,集合框架提供了多种数据结构来存储和操作数据.其中,双列集合Map是一种非常有用且广泛使用的数据结构,本文我将深入探讨Java中的双列集合Map,介绍其特点、常用方法和使用场景.一、什么是双列集合Map?双列集合Map是一种用于存储键值对(Key-ValuePair)的数据结构.......