面试官问:“谈谈对AOP的理解”

答:

  • AOP(Aspect-Oriented Programming,面向切面编程):是一种新的方法论,是对传统 OOP(Object-Oriented Programming,面向对象编程)的补充。面向对象是纵向继承,面向切面是横向抽取。
  • AOP编程操作的主要对象是切面(aspect),而切面用于模块化横切关注点(公共功能)
  • 面向切面编程,就是将交叉业务逻辑封装成切面,利用AOP的功能将切面织入到主业务逻辑中。所谓交叉业务逻辑是指,通用的,与主业务逻辑无关的代码,如安全检查,事物,日志等。若不使用AOP,则会出现代码纠缠,即交叉业务逻辑与主业务逻辑混合在一起。这样,会使业务逻辑变得混杂不清。
  • 在应用AOP编程时,仍然需要定义公共功能,但可以明确的定义这个功能应用在哪里,以什么方式应用,并且不必修改受影响的类。这样一来横切关注点就被模块化到特殊的类里——这样的类我们通常称之为“切面”。
  • AOP的好处:
    • 每个事物逻辑位于一个位置,代码不分散,便于维护和升级
    • 业务模块更简洁,只包含核心业务代码

代理分为静态代理动态代理,静态代理,顾名思义,就是你自己写代理对象,动态代理,则是在运行期,生成一个代理对象。

Spring AOP就是基于动态代理的,如果要代理的对象,实现了某个接口,那么Spring AOP会使用JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用JDK Proxy去进行代理了(为啥?你写一个JDK Proxy的demo就知道了),这时候Spring AOP会使用Cglib,生成一个被代理对象的子类,来作为代理,放一张图出来就明白了:

面试官问:“谈谈对AOP的理解”

上面讲的是AOP的第一种实现,运行时织入

但是不是所有AOP的实现都是在运行时进行织入的,因为这样效率太低了,而且只能针对方法进行AOP,无法针对构造函数、字段进行AOP。

我完全可以在编译成class时就织入啊,比如AspectJ,Spring AOP已经集成了AspectJ。

题外

  • AOP术语

    • 横切关注点:从每个方法中抽取出来的同一类非核心业务。

    • 切面(Aspect):封装横切关注点信息的类,每个关注点体现为一个通知方法。

    • 通知(Advice):切面必须要完成的各个具体工作

    • 目标(Target):被通知的对象

    • 代理(Proxy):向目标对象应用通知之后创建的代理对象

    • 连接点(Joinpoint):横切关注点在程序代码中的具体体现,对应程序执行的某个特定位置。例如:类某个方法调用前、调用后、方法捕获到异常后等。在应用程序中可以使用横纵两个坐标来定位一个具体的连接点:

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xQILCTvi-1591795075824)(C:\Users\QHC\AppData\Roaming\Typora\typora-user-images\1591275600892.png)]

    • 切入点(pointcut):定位连接点的方式。每个类的方法中都包含多个连接点,所以连接点是类中客观存在的事物。如果把连接点看作数据库中的记录,那么切入点就是查询条件——AOP可以通过切入点定位到特定的连接点。切点通过org.springframework.aop.Pointcut 接口进行描述,它使用类和方法作为连接点的查询条件。

公众号回复【项目实战】领实战视频+课件资料
B站https://www.bilibili.com/video/BV1x54y1Q7XK/ 看算法课,第一季已更完

面试官问:“谈谈对AOP的理解”