注解是一种AOP吗?

5

来自Oracle的介绍:

注解是元数据的一种形式,提供有关程序的数据,而这些数据并不是程序本身的一部分。注解对代码的操作没有直接影响。

来自维基百科的介绍:

在计算机领域中,面向方面编程(AOP)是一种旨在通过允许横切关注点的分离来增加模块化的编程范例。AOP为面向方面的软件开发奠定了基础。

我的问题是:如果我使用像@EJB这样的注解,我可以说我正在使用AOP吗?因为它对我来说似乎是一个横切关注点(例如资源查找)。 请解释是否是或否,或者有时注解是AOP。


EJB 管理依赖注入,AOP 是另一回事。不过,AOP 框架可以使用注解。 - holap
3个回答

8

注释本身不是AOP,它们只是为一个类、属性或方法添加元数据。从AOP的角度来看,您可以说注释描述“方面”,但它们本身并没有提供任何额外的功能。

AOP通常需要信息来确定在哪里注入或提供拦截。一些AOP库使用XML来描述程序中需要编织其功能的位置,而其他一些则使用注释来实现此目的。

因此,注释不是AOP,而是标记代码中AOP可以介入并添加横切关注点的位置的一种方式。


1
整个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意味着解耦代码编写和组合方式。您可以有方面在返回语句、异常抛出期间或方法结束时执行某些操作。您还可以使用方面来实现隐藏接口、类或各种各样的内容。


1
字节码增强只是AOP的一种形式。Spring代理AOP的工作原理是在运行时检查注解并插入垫片。 - chrylis -cautiouslyoptimistic-

0

面向切面编程是一种具体的技术(我不认为AOP可以被视为一种范式),您可以创建“切面”,切面封装了某些行为的执行以及这些行为被执行的位置(在AOP术语中称为切入点)。

您可以将注释视为定义“切入点”的机制,并且您需要另一件事情,例如运行时环境(例如应用程序服务器)或者可能是编译时例程(考虑用于生成某种形式文档的注释)来执行与该注释相关联的行为。

有时用于类似的目的,例如,用于事务的注释用于实现这种横切关注点,使用AOP可以非常相似地实现。简单地说,它们是不同的技术,有时用于解决类似的问题,但在我看来,注释不是AOP的一种形式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接