核心Java-创建自定义AOP

核心Java-创建自定义AOP,java,aop,Java,Aop,我想知道AOP实际上是如何工作的,是否有一种方法可以创建我们自己的AOP。应采取哪些步骤和最佳实践?基本上,AOP有两个不同的概念: :使用这个概念,您可以创建“建议”,在编译字节码时可以将其转换为常规java代码。(尽管在运行时有这样做的可能性)。这种方法允许您编写一次代码,并且(通过建议)将代码分发到许多可能彼此没有任何关系的类中 :这可以想象为“Decorator”设计模式的一个示例用法。使用字节码指令插入某些库(如cglib),您可以拦截函数调用并添加自己的代码以提前执行。这是一种更“

我想知道AOP实际上是如何工作的,是否有一种方法可以创建我们自己的AOP。应采取哪些步骤和最佳实践?

基本上,AOP有两个不同的概念:

  • :使用这个概念,您可以创建“建议”,在编译字节码时可以将其转换为常规java代码。(尽管在运行时有这样做的可能性)。这种方法允许您编写一次代码,并且(通过建议)将代码分发到许多可能彼此没有任何关系的类中

  • :这可以想象为“Decorator”设计模式的一个示例用法。使用字节码指令插入某些库(如cglib),您可以拦截函数调用并添加自己的代码以提前执行。这是一种更“自然”(当然更简单)的方法,因此,如果您真的要实现自己的AOP库,那么这可能是更好的方法


基本上,AOP有两个不同的概念:

  • :使用这个概念,您可以创建“建议”,在编译字节码时可以将其转换为常规java代码。(尽管在运行时有这样做的可能性)。这种方法允许您编写一次代码,并且(通过建议)将代码分发到许多可能彼此没有任何关系的类中

  • :这可以想象为“Decorator”设计模式的一个示例用法。使用字节码指令插入某些库(如cglib),您可以拦截函数调用并添加自己的代码以提前执行。这是一种更“自然”(当然更简单)的方法,因此,如果您真的要实现自己的AOP库,那么这可能是更好的方法


AOP有不同的步骤,但基本上是在指定条件下自动执行另一个操作,例如:

  • 在对专用包的任何类调用任何方法之前,请记录一些内容
  • 获取执行特定方法之前和之后的时间
  • 将对类的特定属性的任何访问替换为对数据库元素的直接访问
前两个示例更容易实现,因为它们涉及方法。因此,如果这些方法是公开的,那么代理机制就足够了。第三个确实需要字节码编辑

所以你必须问自己的第一个问题是你真正的需要是什么。如果您需要完整的AspectJ功能,唯一的方法就是字节码编辑。我在这里的建议是不要试图重新发明轮子,而依赖AspectJ实现

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

TL/DR:所以您有3个实现级别,从简单/低功耗到更高/全功耗:

  • 依赖JDK代理:只能处理公共方法调用,但肯定是最简单的方法;另一个限制,无法处理内部调用(来自类本身的调用)
  • 依赖CGLib代理:中间方式:需要有限的字节码编辑,可以处理私有方法调用,但仍然无法处理直接属性访问
  • 重新实现AspectJ:全功率,但。。。祝你好运
AOP有不同的步骤,但基本上是在指定条件下自动执行另一个操作,例如:

  • 在对专用包的任何类调用任何方法之前,请记录一些内容
  • 获取执行特定方法之前和之后的时间
  • 将对类的特定属性的任何访问替换为对数据库元素的直接访问
前两个示例更容易实现,因为它们涉及方法。因此,如果这些方法是公开的,那么代理机制就足够了。第三个确实需要字节码编辑

所以你必须问自己的第一个问题是你真正的需要是什么。如果您需要完整的AspectJ功能,唯一的方法就是字节码编辑。我在这里的建议是不要试图重新发明轮子,而依赖AspectJ实现

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

TL/DR:所以您有3个实现级别,从简单/低功耗到更高/全功耗:

  • 依赖JDK代理:只能处理公共方法调用,但肯定是最简单的方法;另一个限制,无法处理内部调用(来自类本身的调用)
  • 依赖CGLib代理:中间方式:需要有限的字节码编辑,可以处理私有方法调用,但仍然无法处理直接属性访问
  • 重新实现AspectJ:全功率,但。。。祝你好运
了解其工作原理:@RC.-它告诉工作人员。。。我期待着看看内部情况如何implemented@Varun:阅读此-了解其工作原理:@RC。-它告诉工作人员。。。我期待着看看内部情况如何implemented@Varun:读这个-