Spring AOP 与 AspectJ

spring AOP 基于代理(Proxy)的方式实现AOP
实现的方式是运行时代理
具体细节可以参考
JDK动态代理
Spring AOP基本概念
切面增强简单流程
spring 事务

AspectJ 是eclipse开源的一个面向切面编程项目.
是基于字节码织入的方式实现AOP, AspectJ提供两种方式的织入

  • 编译时织入, 需要特殊的编译器,并配合AspectJ涉及的语言语法文件针对织入.
  • 类加载时织入, 需要指定jvm代理,并配置aop.xml
    从这两点得知,不能通过编写java代码实现AspectJ的织入,必须要通过特殊编译器或者jvm代理。

同时spring AOP完全兼容AspectJ的语法,即可以使用AspectJ的注解配置方式声明切面合增强,且通过代理实现AOP。

总结

Spring AOP的优势

  • 纯java代码, 且兼容AspectJ的注解
  • 配置简单

AspectJ的优势

  • 字节码织入,运行时代码执行效率高
  • 被织入对象的方法内调用同对象的方法也会走增强方法。
  • 支持属性, finnal方法的增强。

Spring AOP的劣势

  • 运行时代理,通过反射调用被代理对象,效率没有代码织入效率好
  • 被代理对象方法内调用同一个对象的方法不会触发增强
  • 只支持方法增强(且方法不能是finnal)

AspectJ

  • 需要编写非java代码或者通过jvm代理,不能使用单纯的java代码整合到spring中.

你可能感兴趣的:(Spring AOP 与 AspectJ)