繁体   English   中英

核心Java-创建自定义AOP

[英]Core Java - Create custom AOP

我想知道AOP实际如何工作,是否有一种方法可以创建自己的AOP。 相同的步骤应采取什么步骤和最佳做法?

本质上,AOP有两种不同的概念:

  • 类编织 :使用此概念,您可以创建“建议”,在编译字节码时可以将其转换为常规Java代码。 (尽管有可能在运行时执行此操作)。 这种方法允许您编写一次代码,并(通过建议)将此代码分布在可能彼此无关的许多类中。

  • 基于代理的 :您可以想象“装饰器”设计模式的示例用法。 使用字节码检测某些库(例如cglib),您可以拦截函数调用并添加自己的代码以预先执行。 这是一种更“自然”的方法(而且肯定更简单),因此,如果您真的要实现自己的AOP库,那么可能是更好的方法。

AOP的步骤不同,但是基础知识会自动在指定条件下执行其他操作 ,例如:

  • 在专用包的任何类上调用任何方法之前,请记录一些内容
  • 得到执行特定方法之前和之后的时间
  • 用对数据库元素的直接访问替换对类的特定属性的任何访问

前两个示例更易于实现,因为它们涉及方法。 因此,如果这些方法是公开的,则代理机制就足够了。 第三个确实需要字节码编辑。

因此,您必须问自己的第一个问题是您的真正需求是什么。 如果您需要完全的AspectJ功能,唯一的方法就是字节码编辑。 我的建议是不要尝试重新发明轮子,而要依靠AspectJ实现

如果唯一的拦截点是公共方法调用,则可以尝试模仿基于JDK代理的Spring AOP。 它还可以使用cglib代理,这些代理更具侵入性,但功能更强大(不需要接口并且可以处理非公共方法)。

TL / DR:因此,您具有3个实现级别,从更简单/功能更弱到更强大/功能更全:

  • 依靠JDK代理:只能处理公共方法调用,但是肯定是最简单的方法; 另一个限制,不能处理内部调用(源自类本身的调用)
  • 依赖CGLib代理:中介方式:需要有限的字节码编辑,并且可以处理私有方法调用,但仍不能处理直接属性访问
  • 重新实现AspectJ:功能强大,但是...祝您好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM