AOP(1)介绍&分类

一、有了OOP,为什么还需要AOP?

  • 我们在精熟了OOP的方方面面,包括什么设计模式。但是我们还是无法解决某些问题。
  • 对于系统中普通的业务关注点,OOP可以很好地对其进行分解并使之模块化,但却无法更好地避免类似于系统需求地实现在系统中各处散落这样地问题。(安全检查、系统日志、事务管理)

二、AOP的尴尬?

  • AOP现在没有主权,所以,现时代的AOP实现都需要“寄生”于OOP的主权领土中。

三、静态AOP

  • 以AspectJ为例:相应的横切关注点以Aspect形式实现之后,会通过特定的编译器,将实现后的Aspect编译并织入到系统的静态类中。
  • 优点:Aspect直接以java字节码的形式编译到java类中,jvm可以像通常一样加载java类运行,几乎没有性能损失。
  • 缺点:不够灵活,一旦需要修改,就需要重新编译,重新织入。

四、动态AOP

  • 动态代理:可以在运行期间,为相应的接口动态生成对应的代理对象。
  • 缺点:所有需要织入横切关注点逻辑的模块类都得实现相应得接口,因为动态代理机制只针对接口有效。Spring默认采用这种机制。
  • 优点:相比于动态字节码增强,性能由一定得优势,因为这是通过JVM做的,性能差不多是1.5倍
  • 动态字节码增强:在运行期间,通过动态字节码增强技术为这些系统模块类生成相应的子类,而将横切逻辑加到这些子类中,让应用程序在执行期间使用的是这些动态生成的子类,从而达到将横切逻辑织入系统的目的。
  • 优点:目标类不再不需要实现相应的接口,摆脱了接口,spring在动态代理不能用的时候,采用cglib。

五、自定义类加载器

  • 在class文件加载期间,将横切逻辑,进行织入,然后进行偷梁换柱。。。

你可能感兴趣的:(AOP(1)介绍&分类)