Spring AOP之概念解释

直入主题,下面对AOP中几个关键的术语进行简单的说明

1)连接点(JoinPoint)

连接点是对程序执行过程中可被织入额外代码的特定点的描述。连接点包含了两个信息,一个是描述代码中定义好的客观存在事物的“位置”,例如某个类中的某个属性、方法等。另一个是描述“位置”在执行过程中的某个时刻,例如:属性的初始化前、属性的初始化后、方法执行前、方法执行后等。

如果我们用代码来描述,则可以像下面这样

//方位描述对象
class Location{
  //某对象【作用的对象】
    String className ;
    //执行点类型【属性、方法等】
    String type ;
    //某执行点名称【对应的属性名、方法名等】
    String name ;
    //构造方法
    public Location(String className,String type,String name){}
}

//执行点描述对象
class JoinPointDefined{
    //方位
    Location location ;
    //执行时间点
    String execTimePoint ;
    //构造方法
    public JoinPointDefined(Location location,String timePoint){}
}

class A{
    String getName(){}
    int getAge(){}
}

//执行点1
JoinPointDefined joinpoint1 = new JoinPointDefined(new Location("com.A",“method”,"getName"),"before") ;
//执行点2
JoinPointDefined joinpoint1 = new JoinPointDefined(new Location("com.A",“method”,"getName"),"after") ;
//执行点3
JoinPointDefined joinpoint2 = new JoinPointDefined(new Location("com.A",“method”,"getAge),"after") ;
//执行点N.....

对于不同的AOP实现框架,其能支持的连接点类型和运行时时刻也不尽相同,例如Spring AOP框架支持对方法在执行前、执行后、执行前后、抛出异常后等几个时刻织入代码。

以上面的类A为例,其中有两个方法,假设Spring AOP框架只支持方法的执行前、执行后、抛出异常后的3个时刻,那么对Spring AOP而已其类A的执行点有 2*3 = 6 个 。

在实际的代码中,我们一般都需要明确的指定在哪些方法上织入我们额外的代码,那么如何来描述呢, 于是便有了切点(Pointcut)

2)切点(Pintcut)

切点用于明确指定连接点中的“方位”,如具体的哪些类中的哪些方法。切点就像SQL中的where条件,其目的就是使用类和方法作为筛选条件在众多的连接点中筛选出满足条件的。在Spring AOP中,切点通过org.springframework.aop.Pointcut接口描述。

通过切点我们筛选出了满足条件的类型和方法,但该方法对应了多个连接点,为了进一步的删选,我们还可以在筛选条件中加上“执行时刻”的信息。

在Spring AOP框架中使用Advice(增强)来描述“执行时刻”的信息。

3)增强(Advice)

增强除了描述“执行时刻”(方位)的信息外,同时还包含了我们在连接点上要织入的程序代码。

在Spring AOP中,每个增强接口都各自代表了其方位信息,如:BeforeAdvice、AfterReturningAdvice等。

4)切面(Aspect)

切面由切点(Pointcut)和增强(Advice)组成,它既包括横切逻辑的定义,也包括连接点的定义。Spring AOP框架根据切面的定义来实施AOP的工作。可以理解为切面就是对切点和增强的引用。

5)目标对象(Target)

上面的“连接点”、“切点”和“增强”都是基于“类”在描述的,其定义的是某些类型中的某些方法上的某些预先定义的运行时刻,可以说他们都是静态的描述信息。

但在程序的运行过程中,每个被切面筛选出的类都可能会被实例化成多个实例,而各个实例就是这里的目标对象,Spring AOP框架会在各个实例上运行织入的代码【可能运行期动态加入执行逻辑,也可能编译期直接织入到class文件中】。

6)织入

就是将增强添加到目标类型的具体连接点上的过程。其实现的方法主要有以下三种
(1):编译器织入,要求使用特殊的编译器
(2):类装载期织入,要求使用特殊的类装载器
(3):动态代理织入
Spring使用动态大理织入,AspectJ采用编译期和类装载期织入。

7)引介(Introduction)

它是一种特殊的增强,由于使用的不是很多,所以放在最后说明。通过引介这种特殊的增强,我们可以给类添加一些属性和方法,例如让某个类通过引介也实现某个接口并为该类添加接口的实现代码。
Spring中的引介接口为:IntroductionInterceptor,Spring为该接口提供了实现类 DelegatingIntroductionInterceptor,一般情况下,我们只需要扩展该实现类就可以定义自己的引介增强类了。

在后面还是基于代码逐步的对Spring AOP进行进一步的说明,包括各种实现方式。

原文地址:https://blog.51cto.com/dengshuangfu/2396632

时间: 2024-08-03 13:21:27

Spring AOP之概念解释的相关文章

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基础概念

spring aop基础概念 1.什么是aop: aspect oriented programming:面向切面编程. 即通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 主要功能是:日志记录,性能统计,安全控制,事务处理,异常处理等. 2.aop的实现方式: (1)预编译:AspectJ (2)运行期动态代理(JDK动态代理.CGLIB动态代理):SpringAOP.JbossAOP 3.aop的概念: (1)切面(aspect):一个关注点的模块化,这个关注点可能会横切多个

Spring AOP:概念

什么是AOP AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. AOP是软件开发思想发展到一定阶段的产物,但AOP的出现并不是要完全替代OOP,而仅作为OOP的有益补充. AOP是有特定的应用场合的,它只适合那些具有横切逻辑的应用场合,如性能检测.访问控制.事务管理及日志记录等.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的

Spring学习总结(1)——Spring AOP的概念理解

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

Spring Framework源码(六):Spring AOP之解析标签

首先看下spring framework配置例子: <aop:config> <aop:aspect id="myaop" ref="log"> <aop:pointcut id="mycut" expression="execution(* cn.itcast.service..*.*(..))"/> <aop:before pointcut-ref="mycut"

Java面试--Spring技术要点--Spring AOP(面向切面编程)

33  Spring AOP的概念 面向切面的编程,是一种编程技术,是OOP(面向对象编程)的补充和完善.OOP的执行是一种从上往下的流程,并没有从左到右的关系.因此在OOP编程中,会有大量的重复代码.而AOP则是将这些与业务无关的重复代码抽取出来,然后再嵌入到业务代码当中.常见的应用有:权限管理.日志.事务管理等. 实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行:二是采用静态织入的方式,引入特定的语法创建"方面"

Spring AOP注解方式实现

简介 上文已经提到了Spring AOP的概念以及简单的静态代理.动态代理简单示例,链接地址:https://www.cnblogs.com/chenzhaoren/p/9959596.html 本文将介绍Spring AOP的常用注解以及注解形式实现动态代理的简单示例. 常用注解 @aspect:定义切面 @pointcut:定义切点 @Before:前置通知,在方法执行之前执行 @After:后置通知,在方法执行之后执行 @AfterRunning:返回通知,在方法返回结果之后执行 @Aft

化繁就简,如何利用Spring AOP快速实现系统日志

1.引言 有关Spring AOP的概念就不细讲了,网上这样的文章一大堆,要讲我也不会比别人讲得更好,所以就不啰嗦了. 为什么要用Spring AOP呢?少写代码.专注自身业务逻辑实现(关注本身的业务而不去想其它事情,如安全.事务.日志等),用点上档次的话说:通过非侵入式的方式实现我们要实现的功能. 我们为什么要用Spring AOP来实现系统日志呢?系统日志的特点是在系统的多个模块中都要用到,为了实现日志的统一管理,我们一般有以下三种做法: 定义日志实现类,在需要记录日志的地方创建实例来进行调