注释本身不是AOP,它们只是为一个类、属性或方法添加元数据。从AOP的角度来看,您可以说注释描述“方面”,但它们本身并没有提供任何额外的功能。
AOP通常需要信息来确定在哪里注入或提供拦截。一些AOP库使用XML来描述程序中需要编织其功能的位置,而其他一些则使用注释来实现此目的。
因此,注释不是AOP,而是标记代码中AOP可以介入并添加横切关注点的位置的一种方式。
class Aspect{
public void OnMethodBoundaryStart(some stuff){
System.out.println("Hey the method is starting!")
}
}
class AspectUser{
@OnMethodBoundaryStart
public void SomeMethod(){
System.out.println("Something");
}
}
然后,OnMethodBoundaryStart
代码实际上被直接插入到您的字节码中,注释只是装饰方法,以便进行字节码插入的基础设施知道该怎么做。
因此,注释不是AOP,而AOP不一定是注释。如果编写自己的AOP框架,可以按照自己的方式执行AOP。所有AOP意味着解耦代码编写和组合方式。您可以有方面在返回语句、异常抛出期间或方法结束时执行某些操作。您还可以使用方面来实现隐藏接口、类或各种各样的内容。
面向切面编程是一种具体的技术(我不认为AOP可以被视为一种范式),您可以创建“切面”,切面封装了某些行为的执行以及这些行为被执行的位置(在AOP术语中称为切入点)。
您可以将注释视为定义“切入点”的机制,并且您需要另一件事情,例如运行时环境(例如应用程序服务器)或者可能是编译时例程(考虑用于生成某种形式文档的注释)来执行与该注释相关联的行为。
有时用于类似的目的,例如,用于事务的注释用于实现这种横切关注点,使用AOP可以非常相似地实现。简单地说,它们是不同的技术,有时用于解决类似的问题,但在我看来,注释不是AOP的一种形式。