首页 > 编程语言 >spring——AOP面向切面编程——代理讲解

spring——AOP面向切面编程——代理讲解

时间:2022-12-11 13:22:15浏览次数:41  
标签:spring aop 代理 切面 Spring org AOP

 

 

Spring AOP 是 Spring 框架的核心模块之一,它使用纯 Java 实现,因此不需要专门的编译过程和类加载器,可以在程序运行期通过代理方式向目标类织入增强代码。

Spring AOP 的代理机制

Spring 在运行期会为目标对象生成一个动态代理对象,并在代理对象中实现对目标对象的增强。

Spring AOP 的底层是通过以下 2 种动态代理机制,为目标对象(Target Bean)执行横向织入的。

代理技术描述
JDK 动态代理 Spring AOP 默认的动态代理方式,若目标对象实现了若干接口,Spring 使用 JDK 的 java.lang.reflect.Proxy 类进行代理。
CGLIB 动态代理 若目标对象没有实现任何接口,Spring 则使用 CGLIB 库生成目标对象的子类,以实现对目标对象的代理。

注意:由于被标记为 final 的方法是无法进行覆盖的,因此这类方法不管是通过 JDK 动态代理机制还是 CGLIB 动态代理机制都是无法完成代理的。

Spring AOP 连接点

Spring AOP 并没有像其他 AOP 框架(例如 AspectJ)一样提供了完成的 AOP 功能,它是 Spring 提供的一种简化版的 AOP 组件。其中最明显的简化就是,Spring AOP 只支持一种连接点类型:方法调用。您可能会认为这是一个严重的限制,但实际上 Spring AOP 这样设计的原因是为了让  Spring 更易于访问。

方法调用连接点是迄今为止最有用的连接点,通过它可以实现日常编程中绝大多数与 AOP 相关的有用的功能。如果需要使用其他类型的连接点(例如成员变量连接点),我们可以将 Spring AOP 与其他的 AOP 实现一起使用,最常见的组合就是 Spring AOP + ApectJ。 

Spring AOP 通知类型

AOP 联盟为通知(Advice)定义了一个 org.aopalliance.aop.Interface.Advice 接口。

Spring AOP 按照通知(Advice)织入到目标类方法的连接点位置,为 Advice 接口提供了 6 个子接口,如下表。

通知类型接口描述
前置通知  org.springframework.aop.MethodBeforeAdvice 在目标方法执行前实施增强。
后置通知 org.springframework.aop.AfterAdvice 在目标方法执行后实施增强。
后置返回通知 org.springframework.aop.AfterReturningAdvice 在目标方法执行完成,并返回一个返回值后实施增强。
环绕通知 org.aopalliance.intercept.MethodInterceptor 在目标方法执行前后实施增强。
异常通知 org.springframework.aop.ThrowsAdvice 在方法抛出异常后实施增强。
引入通知 org.springframework.aop.IntroductionInterceptor 在目标类中添加一些新的方法和属性。

Spring AOP 切面类型

Spring 使用 org.springframework.aop.Advisor 接口表示切面的概念,实现对通知(Adivce)和连接点(Joinpoint)的管理。

在 Spring AOP 中,切面可以分为三类:一般切面、切点切面和引介切面。

切面类型接口描述
一般切面 org.springframework.aop.Advisor Spring AOP 默认的切面类型。

由于 Advisor 接口仅包含一个 Advice(通知)类型的属性,而没有定义 PointCut(切入点),因此它表示一个不带切点的简单切面。

这样的切面会对目标对象(Target)中的所有方法进行拦截并织入增强代码。由于这个切面太过宽泛,因此我们一般不会直接使用。
切点切面 org.springframework.aop.PointcutAdvisor Advisor 的子接口,用来表示带切点的切面,该接口在 Advisor 的基础上还维护了一个 PointCut(切点)类型的属性。

使用它,我们可以通过包名、类名、方法名等信息更加灵活的定义切面中的切入点,提供更具有适用性的切面。
引介切面 org.springframework.aop.IntroductionAdvisor Advisor 的子接口,用来代表引介切面,引介切面是对应引介增强的特殊的切面,它应用于类层面上,所以引介切面适用 ClassFilter 进行定义。

 

标签:spring,aop,代理,切面,Spring,org,AOP
From: https://www.cnblogs.com/xiaobaibailongma/p/16973583.html

相关文章

  • Spring Boot 访问Redis的三种方式
    前言最近在极客时间上面学习丁雪丰老师的《玩转Spring全家桶》,其中讲到访问Redis的方式,我专门把他们抽出来,在一起对比下,体验一下三种方式开发上面的不同,分别是这三种方......
  • spring中cache注解中加上表达式会变慢!
    在老外的两篇博文中,​​https://plumbr.io/blog/performance-blog/more-about-spring-cache-performance​​​,​​https://plumbr.io/blog/performance-blog/spring-cache......
  • spring boot 2.x 不占用端口方式启动
    当我们通过springboot仅运行一些定时任务时,就可以不用占用web启动端口,这时候就需要springboot不占用web端口的方式;springboot2.x之后(代码方式)@SpringBootApplicati......
  • 基于Java+Springboot+Vue+elememt甜品屋蛋糕商城系统设计和实现
    目录​​一、开发背景和技术:​​​​1.1开发背景  ​​​​1.2B/S体系结构​​​​1.3Java语言简介​​​​1.4SpringBoot框架​​​​1.5MySQL简介​​​​二、系统......
  • springboot 整合使用redis发布订阅功能
    在Java中有3种流程控制结构:顺序结构、选择结构、循环结构。顺序结构顺序结构是指程序从上向下依次执行每条语句的结构,中间没有任何的判断和跳转。选择结构选择结构是根据条......
  • Spring之基础知识
    1、ApplicationContextVSBeanFactoryl 二者来自的jar包不同;BeanFactory来自spring.beans.jar;ApplicationnContext来自spring.context.jar下。l BeanFactory......
  • 解决SpringCloudConfig中文乱码问题
    问题来自于配置服务端使用的编码格式为ISO-8859-1导致  这里处理后的结果添加两个类CustomizedOriginTrackedPropertiesLoader和CustomizedPropertiesPropertySource......
  • SpringSecurity 学习记录
    SpringSecurity简介SpringSecurity,这是一种基于SpringAOP和Servlet过滤器的安全框架。它提供全面的安全性解决方案,同时在Web请求级和方法调用级处理身份确认和授......
  • 【02期】你能说说Spring框架中Bean的生命周期吗?
    首先简单说一下(以下为一个回答的参考模板)1、实例化一个Bean--也就是我们常说的new;2、按照Spring上下文对实例化的Bean进行配置--也就是IOC注入;3、如果这个Bean已经实现了Bea......
  • spring mvc环境之Aop切面的xml配置和注解(AspectJ)(十)
     Spring的AOP引入步骤:1.引入jar,pom.xml加入spring-aop坐标(一般引入数据库事务的时候已经引用了).2.创建目标接口和目标对象(bean类,service或dao层).3.创建切面类(类......