AOP面向切面编程【图文教程】_第1章

2 篇文章 0 订阅

平凡也就两个字: 懒和惰;
成功也就两个字: 苦和勤;
优秀也就两个字: 你和我。
跟着我从0学习JAVA、spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美!
关注微信公众号【 IT特靠谱 】,每一篇文章都是心得总结,跟我学习你就是大牛!

 

AOP面向切面编程【图文教程】_第1章

--AOP面向切面编程基本概念和术语

 

1 前言

      AOP(Aspect-oriented Programming)面向切面编程, AOP是对OOP(面向对象编程)的补充。

      面向对象编程(OOP):是一种自上而下的编程思想。基本单元:class。例如:当调用controller层的方法时,会依次调用controller-->service--->dao层。假如我想给每个controller方法添加打印执行时间的代码,那么OOP模式就需要给每个controller方法添加如下代码:

 

      假如我们需要优化记录执行时间的代码,那么我们就需要修改每一个controller方法!天呐!但是AOP能解决这个问题!

      面向切面编程(AOP):是一种横切编程的思想。基本单元:Aspect切面。上图1和3步跟业务逻辑无关,2步才是真正的业务逻辑处理的地方。把记录时间日志和业务处理逻辑耦合在一起是一件非常不理智的做法,AOP完美解决了这个问题:AOP面向切面编程以横切的方式增强了业务逻辑,使得业务逻辑和非业务逻辑解耦,让开发人员更专注于业务逻辑开发!

      扩展1:在spring中,事务控制和日志记录等用到了AOP面向切面编程技巧!!然而AOP是通过代理来实现的!

      扩展2:Spring代理有两种:(1)spring AOP:spring默认实现的jdk动态代理;

                                                   (2)AspectJ:AspectJ框架实现的cglib动态代理。

                  Spring 代理默认使用标准的jdk动态代理来代理对象,要求被代理的对象必须至少实现1个接口。Spring代理也可以用cglib来代理对象,cglib是用来代理class的,而不是代理interface的。我们建议代理对象实现接口,通过jdk动态代理来代理对象。也就是说:被代理的业务对象如果没有实现接口,那么会用cglib动态代理来代理;如果业务对象实现了接口,那么会用jdk动态代理来代理。

 

2 AOP术语

2.1  Aspect:切面

      Aspect切面由 pointcut 和 advice 组成, 它既包含了横切逻辑的定义, 也包括了连接点的定义. Spring AOP就是负责实施切面的框架, 它将切面所定义的横切逻辑织入到切面所指定的连接点中。AOP的工作重心在于如何将增强织入目标对象的连接点上, 这里包含两个工作:(1)如何通过 pointcut 和 advice 定位到特定的 joinpoint 上;(2)如何在 advice 中编写切面代码。
      可以简单地认为:使用 @Aspect 注解的类就是切面。

 

2.2  join point:连接点

      程序执行过程中明确的点,一般是方法的调用。

 

2.3  Pointcut:切入点

      就是带有通知(意味着会被执行、走到)的连接点,在程序中主要体现为书写切入点表达式。连接点和切入点的理解(借用某大佬的比喻):

 

 

2.4  Advice:通知

      AOP在特定的切入点(pointcut)上执行的增强处理(切面代码)。有如下5种通知类型:

    (1)before:前置增强

    (2)after:后置增强

    (3)Around:环绕增强

    (4)afterThrowing:异常抛出后增强

    (5)afterReturning:业务逻辑返回后增强

      通知的理解:通知定义了切面要干什么、要执行什么代码,以及它将于何时被调用。而切入点定义了切面代码将于何处被执行,可以想到,通知和切入点是搭配使用的,即“通知切入点将于何时执行"通知"这段代码”。

      通知类型细说:通知也是有优先级、顺序的,虽然从下面的描述大致可以猜出来执行优先级,但这里还是描述下。进入目标方法时,先织入Around,再织入Before,退出目标方法时,先织入Around,再织入AfterReturning,最后才织入After。注意:Spring AOP的环绕通知会影响到AfterThrowing通知的运行,不要同时使用!同时使用也没啥意义。

 

 

2.5  Target object:目标对象或被通知对象

       被通知对象,指被织入Advice通知的对象。该对象是一个在运行时创建的AOP代理对象(接口类型通过jdk动态代理类代理,普通类通过cglib代理对象代理)!

织入 advice 的目标对象也被称为 advised object。因为 Spring AOP 使用运行时代理的方式来实现 aspect, 因此 adviced object 总是一个代理对象(proxied object)。注意, adviced object 指的不是原来的类, 而是织入 advice 后所产生的代理类

 

2.6  AOP proxy:AOP代理

      通过AOP框架创建的代理对象能够执行Advice通知的增强代码。代理对象就是通过AOP代理类创建的,在spring框架中,AOP代理有两类:JDK动态代理和cglib代理

      Spring AOP 默认使用标准的 JDK 动态代理(dynamic proxy)技术来实现 AOP 代理, 通过它, 我们可以为任意的接口实现代理。如果需要为一个实现代理, 那么可以使用 CGLIB 代理。当一个业务逻辑对象没有实现接口时, 那么Spring AOP 就默认使用 CGLIB 来作为 AOP 代理了. 即如果我们需要为一个方法织入 advice, 但是这个方法不是一个接口所提供的方法, 则此时 Spring AOP 会使用 CGLIB 来实现动态代理. 鉴于此, Spring AOP 建议基于接口编程, 对接口进行 AOP 而不是类

 

2.7  Weaving:织入

      将 aspect 和其他对象连接起来, 并创建 adviced object 的过程。将通知织入到被增强对象的指定切入点!Spring 采用动态代理织入, 而AspectJ采用编译器织入和类装载期织入。

     下一章节将详细介绍aop面向切面编程的使用姿势!如果以上教程对您有帮助,为了不迷路,请关注一下吧~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT_Most

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值