spring AOP

简介:

guo duogdngengegghu说明


    通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP


    Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中


什么是AOP


    AOP(Aspect Orient Programming),也就是面向切面编程


    面向对象编程(OOP)是从静态角度考虑程序结构, 面向切面编程(AOP)是从动态角度考虑程序运行过程 


AOP的作用


    处理一些具有横切性质的系统性服务,如事务管理、安全检查、缓存、对象池管理等


AOP的实现原理


    AOP 实际上是由目标类的代理类实现的。AOP 代理其实是由AOP 框架动态生成的一个对象,该对象可作为目标对象使用


    AOP 代理包含了目标对象的全部方法,但AOP 代理中的方法与目标对象的方法存在差异,AOP 方法在特定切入点添加了增强处理,并回调了目标对象的方法


AOP实现


1.静态AOP
机制:静态织入
原理:在编译期,切面直接以字节码的形式编译到目标字节码文件中
优点:对系统无性能影响
缺点:灵活性不够
2.动态AOP
机制:动态代理
原理:在运行期,目标类加载后,为接口动态生成代理类,将切面植入到代理类中
优点:相对于静态AOP更加灵活
缺点:切入的关注点需要实现接口。对系统有一点性能影响
代表:JDK动态代理
接口 + InvocationHandler + 目标对象 = 代理
3.动态字节码生成
机制:在运行期,目标类加载后,动态构建字节码文件生成目标类的子类,将切面逻辑加入到子类中
原理:没有接口也可以织入
优点:扩展类的实例方法为final时,则无法进行织入
代表:Cglib动态代理(依赖ASM)
接口或类 + MethodInterceptor + 目标对象 = 代理
4.自定义加载器
机制:在运行期,目标加载前,将切面逻辑加到目标字节码里
原理:可以对绝大部分类进行织入
优点:代码中如果使用了其他类加载器,则这些类将不会被织入
代表:Javassist
5.字节码转换
机制:在运行期,所有类加载器加载字节码前,前进行拦截
原理:可以对所有类进行织入
代表:Javassit + Instrumentation


Spring对AOP的支持


    Spring 中AOP 代理由Spring 的IoC 容器负责生成、管理,其依赖关系也由IoC 容器负责管理。因此,AOP 代理可以直接使用容器中的其他Bean 实例作为目标,这种关系可由IoC 容器的依赖注入提供


    Spring 默认使用Java 动态代理来创建AOP 代理, 这样就可以为任何接口实例创建代理了。当需要代理的类不是代理接口的时候, Spring 自动会切换为使用CGLIB 代理,也可
强制使用CGLIB


    AOP 编程
    定义普通业务组件
    定义切入点,一个切入点可能横切多个业务组件
    定义增强处理,增强处理就是在AOP 框架为普通业务组件织入的处理动作


    所以进行AOP 编程的关键就是定义切入点和定义增强处理。一旦定义了合适的切入点和增强处理,AOP 框架将会自动生成AOP 代理,即:代理对象的方法 = 增强处理 + 被代理对象的方法


Spring中AOP的实现


1.基于Annotation 的“零配置”方式:使用@Aspect、@Pointcut 等Annotation 来标注切入点和增强处理
a.首先启用Spring 对@AspectJ 切面配置的支持
b.定义切面Bean
当启动了@AspectJ 支持后,只要在Spring 容器中配置一个带@Aspect 注释的Bean, Spring 将会自动识别该Bean 并作为切面处理
c.定义@Before 增强处理
d.定义@AfterReturning 增强处理
e.定义@AfterThrowing 增强处理
f.定义@After 增强处理
After 增强处理与AfterReturning 增强处理有点相似,但也有区别
AfterReturning 增强处理处理只有在目标方法成功完成后才会被织入
After增强处理不管目标方法如何结束(保存成功完成和遇到异常中止两种情况),它都会被织入
g.@Around 增强处理
h.访问目标方法的参数
i.定义切入点
所谓切入点,其实质就是为一个切入点表达式起一个名称,从而允许在多个增强处理中重用该名称
一个切入点表达式
一个包含名字和任意参数的方法签名


2.基于XML 配置文件的管理方式:使用Spring 配置文件来定义切入点和增强点


使用Spring ProxyFactoryBean创建代理


    使用 ProxyFactoryBean 来创建 AOP 代理的最重要的优点之一是 IoC 可以管理通知和切入点。 这是一个非常的强大的功能,能够实现其他 AOP 框架很难实现的特定的方法。例如,一个通知本身可以引用应用对象(除了目标对象,它在任何 AOP 框架中都可以引用应用对象),这完全得益于依赖注入所提供的可插入性


a.ProxyFactoryBean的proxyInterfaces属性,指明要代理的接口
b.ProxyFactoryBean的target属性,指明要代理的目标类 ,这个目标类实现了上面proxyInterfaces属性指定的接口
c.ProxyFactoryBean的interceptorNames属性,指明要在代理的目标类中插入的Adivce 
d.ProxyFactoryBean还有一个proxyTargetClass属性,如果这个属性被设定为“true”,说明 ProxyFactoryBean要代理的不是接口类,而是要使用CGLIB方式来进行代理,后面会详细讲解使用CGLIB方式来进行代理


IntroductionIntercepter


影响了目标物件的行为定义,直接增 加了目标物件的职责


本文转自 www19 51CTO博客,原文链接:http://blog.51cto.com/doujh/1931958,如需转载请自行联系原作者

相关文章
|
4月前
|
监控 安全 Java
Spring AOP实现原理
本内容主要介绍了Spring AOP的核心概念、实现机制及代理生成流程。涵盖切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)等关键概念,解析了JDK动态代理与CGLIB代理的原理及对比,并深入探讨了通知执行链路和责任链模式的应用。同时,详细分析了AspectJ注解驱动的AOP解析过程,包括切面识别、切点表达式匹配及通知适配为Advice的机制,帮助理解Spring AOP的工作原理与实现细节。
|
30天前
|
人工智能 监控 安全
如何快速上手【Spring AOP】?核心应用实战(上篇)
哈喽大家好吖~欢迎来到Spring AOP系列教程的上篇 - 应用篇。在本篇,我们将专注于Spring AOP的实际应用,通过具体的代码示例和场景分析,帮助大家掌握AOP的使用方法和技巧。而在后续的下篇中,我们将深入探讨Spring AOP的实现原理和底层机制。 AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的核心特性之一,它能够帮助我们解决横切关注点(如日志记录、性能统计、安全控制、事务管理等)的问题,提高代码的模块化程度和复用性。
|
29天前
|
设计模式 Java 开发者
如何快速上手【Spring AOP】?从动态代理到源码剖析(下篇)
Spring AOP的实现本质上依赖于代理模式这一经典设计模式。代理模式通过引入代理对象作为目标对象的中间层,实现了对目标对象访问的控制与增强,其核心价值在于解耦核心业务逻辑与横切关注点。在框架设计中,这种模式广泛用于实现功能扩展(如远程调用、延迟加载)、行为拦截(如权限校验、异常处理)等场景,为系统提供了更高的灵活性和可维护性。
|
8月前
|
XML Java 开发者
Spring Boot中的AOP实现
Spring AOP(面向切面编程)允许开发者在不修改原有业务逻辑的情况下增强功能,基于代理模式拦截和增强方法调用。Spring Boot通过集成Spring AOP和AspectJ简化了AOP的使用,只需添加依赖并定义切面类。关键概念包括切面、通知和切点。切面类使用`@Aspect`和`@Component`注解标注,通知定义切面行为,切点定义应用位置。Spring Boot自动检测并创建代理对象,支持JDK动态代理和CGLIB代理。通过源码分析可深入了解其实现细节,优化应用功能。
392 6
|
7月前
|
XML Java 测试技术
Spring AOP—通知类型 和 切入点表达式 万字详解(通俗易懂)
Spring 第五节 AOP——切入点表达式 万字详解!
353 25
|
7月前
|
XML 安全 Java
Spring AOP—深入动态代理 万字详解(通俗易懂)
Spring 第四节 AOP——动态代理 万字详解!
254 24
|
6月前
|
Java API 微服务
微服务——SpringBoot使用归纳——Spring Boot中的切面AOP处理——Spring Boot 中的 AOP 处理
本文详细讲解了Spring Boot中的AOP(面向切面编程)处理方法。首先介绍如何引入AOP依赖,通过添加`spring-boot-starter-aop`实现。接着阐述了如何定义和实现AOP切面,包括常用注解如`@Aspect`、`@Pointcut`、`@Before`、`@After`、`@AfterReturning`和`@AfterThrowing`的使用场景与示例代码。通过这些注解,可以分别在方法执行前、后、返回时或抛出异常时插入自定义逻辑,从而实现功能增强或日志记录等操作。最后总结了AOP在实际项目中的重要作用,并提供了课程源码下载链接供进一步学习。
705 0
|
6月前
|
Java 开发者 微服务
微服务——SpringBoot使用归纳——Spring Boot中的切面AOP处理——什么是AOP
本文介绍了Spring Boot中的切面AOP处理。AOP(Aspect Oriented Programming)即面向切面编程,其核心思想是分离关注点。通过AOP,程序可以将与业务逻辑无关的代码(如日志记录、事务管理等)从主要逻辑中抽离,交由专门的“仆人”处理,从而让开发者专注于核心任务。这种机制实现了模块间的灵活组合,使程序结构更加可配置、可扩展。文中以生活化比喻生动阐释了AOP的工作原理及其优势。
313 0
|
8月前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
539 8
|
10月前
|
XML Java 数据安全/隐私保护
Spring Aop该如何使用
本文介绍了AOP(面向切面编程)的基本概念和术语,并通过具体业务场景演示了如何在Spring框架中使用Spring AOP。文章详细解释了切面、连接点、通知、切点等关键术语,并提供了完整的示例代码,帮助读者轻松理解和应用Spring AOP。
271 2
Spring Aop该如何使用