Spring AOP 详解

目录

 

一、相关术语

1、连接点(Joinpoint)

2、切点(Pointcut)

3、通知(Advice)

4、目标对象(Target)

5、引介(Introduction)

6、织入(Weaving)

7、代理(Proxy)

8、切面(Aspect)

二、动态代理

三、Spring AOP 增强介绍

四、创建切面

五、Spring自动创建代理

六、AOP无法增强疑难问题剖析

七、总结


一、相关术语

1、连接点(Joinpoint)

程序执行的某个特定位置:如类开始初始化前、类初始化后、类某个方法调用前、调用后、方法抛出异常后。一个类或一段程序代码拥有一些具有边界性质的特定点,这些点中的特定点就称为“连接点”。Spring仅支持方法的连接点,即仅能在方法调用前、方法调用后、方法抛出异常时以及方法调用前后这些程序执行点织入增强。连接点由两个信息确定:第一是用方法表示的程序执行点;第二是用相对点表示的方位。如在Test.foo()方法执行前的连接点,执行点为Test.foo(),方位为该方法执行前的位置。

2、切点(Pointcut)

每个程序类都拥有多个连接点,如一个拥有两个方法的类,这两个方法都是连接点,即连接点是程序类中客观存在的事物。AOP通过“切点”定位特定的连接点。连接点相当于数据库中的记录,而切点相当于查询条件。切点和连接点不是一对一的关系,一个切点可以匹配多个连接点。

3、通知(Advice)

也叫增强,是织入到目标类连接点上的一段程序代码,在Spring中,增强除用于描述一段程序代码外,还拥有另一个和连接点相关的信息,这便是执行点的方位。结合执行点方位信息和切点信息,我们就可以找到特定的连接点。

4、目标对象(Target)

增强逻辑的织入目标类。如果没有AOP,目标业务类需要自己实现所有逻辑,而在AOP的帮助下,目标业务类只实现那些非横切逻辑的程序逻辑,而性能监视和事务管理等这些横切逻辑则可以使用AOP动态织入到特定的连接点上。

5、引介(Introduction)

引介是一种特殊的增强,它为类添加一些属性和方法。这样,即使一个业务类原本没有实现某个接口,通过AOP的引介功能,我们可以动态地为该业务类添加接口的实现逻辑,让业务类成为这个接口的实现类。    

6、织入(Weaving)

织入是将增强(通知)添加到目标类具体连接点上的过程。AOP像一台织布机,将目标类、增强或引介通过AOP这台织布机天衣无缝地编织到一起。根据不同的实现技术,AOP有三种织入的方式:

    a、编译期织入,这要求使用特殊的Java编译器。
    b、类装载期织入,这要求使用特殊的类装载器。
    c、动态代理织入,在运行期为目标类添加增强生成子类的方式。
    Spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入。

7、代理(Proxy)

 

 一个类被AOP织入增强后,就产出了一个结果类,它是融合了原类和增强逻辑的代理类。根据不同的代理方式,代理类既可能是和原类具有相同接口的类,也可能就是原类的子类,所以我们可以采用调用原类相同的方式调用代理类。

8、切面(Aspect)

切面由切点和增强(引介)组成,它既包括了横切逻辑的定义,也包括了连接点的定义,Spring AOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的连接点中。

二、动态代理

 

关于动态代理的详细介绍见此文章

我们虽然通过动态代理可以实现横切逻辑的动态织入(如加日志),但这种实现方式存在三个明显需要改进的地方: 

1)目标类的所有方法都添加了性能监视横切逻辑,但有时我们可能只希望对业务类中的某些特定方法添加横切逻辑; 
2)我们通过硬编码的方式指定了织入横切逻辑的织入点,即在目标类业务方法的开始和结束前织入代码; 
3)我们手工编写代理实例的创建过程,为不同类创建代理时,需要分别编写相应的创建代码,无法做到通用。 

以上三个问题,在AOP中占用重要的地位,因为Spring AOP的主要工作就是围绕以上三点展开:

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

 

三、Spring AOP 增强介绍

 

关于Spring AOP 增强见此文章

四、创建切面

关于Spring AOP 创建切面见此文章

五、Spring自动创建代理

关于Spring自动创建代理见此文章

六、AOP无法增强疑难问题剖析

Spring注解无法调用自身的方法原因

七、总结

1、AOP是OOP的延伸,它为程序开发提供了一个崭新的思考角度,可以将任意性的横切逻辑抽取到同一模块中,只有通过OOP的纵向抽象和AOP的横向抽取,程序才可以真正解决重复性代码的问题;

2、 Spring采用JDK动态代理和CGLib动态代理的技术在运行期织入增强,左移用户不需要装备特殊的编译器或类装载器就可以使用AOP的功能,要使用JDK动态代理,目标类必须事先接口,而CGLib不对类做任何限制,通过动态生成目标子类的方式提供代理。JDK在创建代理对象时性能高于CGLib,而生成的代理对象的运行性能却比CGLib低,如果是singleton的代理,推荐使用CGLib动态代理;

3、Spring只能在方法级别上织入增强,Spring提供了4中类型的方法增强,分别是前置增强后置增强环绕增强和异常抛出增强此外还有引介增强,引介增强是类级别的它为目标类织入新的接口实现。广义上来看,增强其实就是一种最简单的切面,他既包括横切代码也包括切点信息,只不过他的切点只是简单地方法相对位置的信息,所以增强一般需要和切点联合才可以表示一个更具有实用性的切面;

4、切面是增强和切点的联合体,用户很方便的通过Spring提供的ProxyBeanFactory将切面织入不同的目标类中。当然,为每一个目标类手工配置一个切面是比较繁琐的,Spring利用BeanPostProcessor 可干涉Bean生命周期的机制,提供了一些可以自动创建代理,织入切面的自动代理创建器,其中DefaultAdivsorAutoProxyCreator是功能强大的自动代理创建器,它可以将容器中所有的Advisor自动织入目标Bean中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值