Spring AOP:概念

什么是AOP

AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

AOP是软件开发思想发展到一定阶段的产物,但AOP的出现并不是要完全替代OOP,而仅作为OOP的有益补充。

AOP是有特定的应用场合的,它只适合那些具有横切逻辑的应用场合,如性能检测、访问控制、事务管理及日志记录等。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

AOP是一种思想,不同的厂商或企业可能有不同的实现方式。在AOP联盟定义的AOP体系结构下有很多的实现者,例如:AspectJ、AspectWerkz、JBoss AOP、Spring AOP等。

Spring AOP 是AOP在Spring中的具体实现,它是构成Spring框架的另一个重要基石。Spring AOP构建于IoC之上,统一于Spring容器中。

AOP术语

1、 连接点(Joinpoint):一个类或一段程序代码拥有一些具有边界性质的特定点。
Spring只支持方法的连接点,即仅能在方法调用前、方法调用后、方法抛出异常及方法调用前后这些程序执行点织入增强。

连接点确定两个信息:1、用方法表示的程序执行点;2、用相对位置表示的方位。
Spring使用切点对执行点进行定位,而方位则在增强类型中定义。

2、 切点(Pointcut):AOP通过“切点”定位特定的连接点。
在Spring中,切点通过org.springframework.aop.Pointcut接口进行描述,它使用类和方法作为连接点的查询条件,Spring AOP的规则解析引擎负责解析切点所设定的查询条件,找到对应的连接点。

因为连接点是方法执行前、执行后等包括方位信息的具体程序执行点,而切点只定位到某个方法,所以如果希望定位到具体的连接点,还需要通过方位的信息。

3、增强(Advice):增强是织入目标类连接点上的一段程序代码。
在Spring中,增强除用于描述一段程序代码外,还拥有另一个和连接点相关的信息,这便是执行点的方位。

结合执行点的方位信息和切点信息,就可以找到特定的连接。

正因为增强既包含用于添加到目标连接点上的一段执行逻辑,又包含用于定位连接点的方位信息,所以Spring所提供的增强接口都是带方位名的,如:BeforeAdvice、AfterReturningAdvice、ThrowsAdvice等。

4、目标对象(Target):增强逻辑的织入目标类。

5、引介(Introduction):引介是一种特殊的增强,它为类添加一些属性和方法。

6、织入(Weaving):织入是将增强添加到目标类的具体连接点上的过程。

AOP有3种织入方式:
1)编译期织入,需要使用特殊的Java编译器
2)类装载期织入,需要使用特殊的Java编译器
3)动态代理织入,在运行期为目标类添加增强生成子类的过程

7、代理(Proxy):一个类被AOP织入增强后,就产生了一个结果类,它是融合了原类和增强逻辑的代理类。根据代理方式的不同,代理类既可以是和原类具有相同接口的类,也可能就是原类的子类。

8、切面(Aspect):切面由切点和增强(引介)组成,它既包括横切逻辑的定义,也包括连接点的定义。

Spring AOP就是负责实施切面的框架。

代理

Spring AOP的底层就是通过使用JDK或CGLib动态代理技术为目标Bean织入横切逻辑的。

Spring AOP通过Pointcut(切点)指定在哪些类的哪些方法上织入横切逻辑,通过Advice(增强)描述横切逻辑和方法的具体织入点(方法前、方法后、方法的两端等)。此外,Spring通过Advisor(切面)将Pointcut和Advice组装起来。有了Advisor的信息,Spring就可以利用JDK或CGLib动态代理技术采用统一的方式为目标Bean创建织入切面的代理对象。

JDK动态代理 vs CGLib动态代理

    • CGlib所创建的动态代理对象的性能高于JDK所创建的动态代理对象(约10倍)
    • CGLib在创建代理对象时所花费的时间比JDK动态代理多(约8倍)
    • 对于Singleton的代理对象或者具有实例池的代理,因为无需频繁的创建代理对象,所以比较适合采用CGLib动态代理技术;反之则适合采用JDK动态代理技术。

原文地址:https://www.cnblogs.com/yang21/p/9968971.html

时间: 2024-08-29 17:24:41

Spring AOP:概念的相关文章

spring Aop概念

面向切面编程(AOP)通过提供另外一种思考程序结构的途经来弥补面向对象编程(OOP)的不足.在OOP中模块化的关键单元是类(classes),而在AOP中模块化的单元则是切面.切面能对关注点进行模块化,例如横切多个类型和对象的事务管理.(在AOP术语中通常称作横切(crosscutting)关注点.) AOP框架是Spring的一个重要组成部分.但是Spring IoC容器并不依赖于AOP,这意味着你有权利选择是否使用AOP,AOP做为Spring IoC容器的一个补充,使它成为一个强大的中间件

spring AOP概念讲解

在软件中,有些行为对于大多数应用都是通用的.比如:日志.安全和事务.如果每个方法里面都去写记日志的方法逻辑,是不是觉得很麻烦,耦合度过高.如果让应用对象只关注自己所针对的业务领域问题,而其他方面的问题由其他应用对象处理,这会不会更好了? 在软件开发中,分布于应用中多处的功能被称为横切关注点.通常,这些横切关注点从概念上是于应用的业务逻辑是分离的(但是往往直接嵌入到应用的业务逻辑之中).将这些横切还珠点于业务逻辑相分离正是面向切面编程(AOP)所要解决的. 1.什么是面向切面编程 前面说了,切面能

Spring AOP概念理解

1.我所知道的aop 初看aop,上来就是一大堆术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充等等.一下子让你不知所措,心想着:怪不得很多人都和我说aop多难多难.当我看进去以后,我才发现:它就是一些java基础上的朴实无华的应用,包括ioc,包括许许多多这样的名词,都是万变不离其宗而已. 2.为什么用aop 1就是为了方便,看一个国外很有名的大师说,编程的人都是"懒人",因为他把自己做的事情都让程序做了.用了aop能让你少写很多代码,这点就够充分了吧 2就是为了

深入理解Spring AOP之基本概念

深入理解Spring AOP之基本概念 AOP到底是什么 Spring AOP和IOC是听到的关于Spring最频繁的两个词了.现在来重点关注AOP这个词,IOC先放一边,下面这段话摘自Spring优势中关于面向切面的介绍: 面向切面--Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发.应用对象只实现它们应该做的--完成业务逻辑--仅此而已.它们并不负责(甚至是意识)其它的系统级关

Spring AOP基本概念

Spring AOP基本概念 目录 Spring AOP定义 AOP基本术语 通知类型 AOP定义 AOP基本术语 切面( Aspect ):一个能横切多个对象的模块化的关注点.对Spring AOP来说,切面就是普通的类(基于模式)或使用 @Aspect 注解的类. 连接点( Joint Point ):程序执行过程中的某个点.对Spring AOP来说,连接点就是方法的执行. 通知( Advice ):切面在某个连接点上执行的动作. 切入点( PointCut ):匹配连接点的断言. 引入(

Spring AOP入门——概念及注意点

AOP是什么? AOP从功能上来说就是在执行某些业务逻辑的前后,可以允许你动态地添加一些操作(比如记录日志.或者是判断是否有权限等),这些操作的添加,完全不耦合于原来的业务逻辑,从而对原有业务逻辑完全是透明. 也就是说,这段操作和业务逻辑是完全分开的,它可能在项目中需要横切多个模块,且其自身也是一个独立的模块,贯穿了整个项目.我们完全可以根据需要启用或者停用这个功能. AOP的典型应用就是事务管理和日志. AOP中的概念 下面这些术语并不是Spring定义的.由于AOP中的术语不是那么形象,所以

Spring核心概念之AOP

一.AOP 的概念 AOP(Aspect Oriented Programming)的缩写,面向切面编程,主要作用就是对代码进行增强处理. 理解面向切面编程的含义:就是在不改变原有程序的基础上为代码增加新的功能. 实现面向切面编程需要了解两个概念: >切入点:可以插入增强处理的方法,比如原对象的fun()方法. >增强处理类型:在原对象fun()方法之前还是之后插入新功能. 二.Spring AOP简单应用 1.新建一个java项目 2.到官网下载Spring AOP和AspectJ框架所需要

Spring第九弹—使用CGLIIB实现AOP功能与AOP概念解释

JDK自从1.3版本开始,就引入了动态代理,并且经常被用来动态地创建代理,原理之前我已经讲过.JDK的动态代理用起来非常简单,但它有一个限制,就是使用动态代理的对象必须实现一个或多个接口.如果想代理没有实现接口的继承的类,该怎么办?现在我们可以使用CGLIB包. PS:需要引入com.springsource.net.sf.cglib-2.2.0.jar包. CGLIB是一个强大的高性能的代码生成包.它广泛的被许多AOP的框架使用,例如:Spring AOP和dynaop,为他们提供方法的int

Spring AOP那些学术概念—通知、增强处理连接点(JoinPoint)切面(Aspect)

1.我所知道的AOP 初看起来,上来就是一大堆的术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充等等.一下让你不知所措,心想着:管不得很多人都和我说AOP多难多难.当我看进去以后,我才行发现:他就是一些Java基础上的朴实无华的应用,包括IOC(见<Spring IOC(依赖注入.控制反转)概念理解>),包括许许多多这样的名词,都是万变不离其宗而已. 2.为什么要用AOP 1)就是为了方便,看一个国外很有名的大师说,编程的人都是“懒人”,因为他把自己做的事情都让程序去做了.

我所理解的Spring AOP的基本概念

Spring AOP中的概念晦涩难懂,读官方文档更是像读天书,看了非常多样例后,写一些自己理解的一些spring的概念.要理解面向切面编程,要首先理解代理模式和动态代理模式. 如果一个OA系统中的一个功能是查看考勤信息,那么我们如果有要实现这个功能,要经历的步骤是: 1.启动日志,进行记录. 2.启动安全性的框架进行安全检验 3.验证权限 4.假设有权限,则查看考勤记录,假设无权限,则输出没有权限. 我们的目标方法是查看考勤记录,而前面运行了那么多与目标方法无关的方法. 那些与业务逻辑无关的方法