【问题标题】:are Annotations a kind of AOP?Annotations 是一种 AOP 吗?
【发布时间】:2014-02-07 23:26:49
【问题描述】:

来自Oracle:

注释是元数据的一种形式,提供不属于程序本身的程序的数据。注释对其注释的代码的操作没有直接影响。

来自wikipedia:

在计算中,面向方面编程 (AOP) 是一种编程范式,旨在通过允许分离横切关注点来提高模块化。 AOP 构成了面向方面的软件开发的基础。

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

【问题讨论】:

  • EJB 管理依赖注入,AOP 是另一回事。无论如何,AOP 框架都可以使用注解。

标签: java aop


【解决方案1】:

注解本身并不是 AOP,它们只是用元数据装饰一个类、属性或方法。在 AOP 术语中,您可以说注释描述“方面”,但它们本身并不提供任何额外的功能。

AOP 通常需要信息来确定在哪里注入或提供拦截。一些 AOP 库使用 XML 来描述程序在其中编织其功能的位置,其他的使用注解来达到同样的目的。

因此,注解不是 AOP,而是一种标记代码中 AOP 可以干预和添加横切关注点的位置的方式。

【讨论】:

    【解决方案2】:

    我发现整个 cross cutting concern mumbo jumbo 与 AOP 非常混淆。要点是,使用 AOP,在编译时,某些东西会将代码插入到您的代码中,从而创建一个新的 munged 字节码。所以想象你有一个方面是(伪代码)

    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 的意思是,它将您编写代码的位置以及代码的组合方式解耦。您可以在 return 语句中、在异常抛出期间或在方法结束时使用切面。您还可以使用方面来实现隐藏的接口、类或各种东西。

    【讨论】:

    • 字节码增强只是 AOP 的一种。 Spring 代理 AOP 完全通过在运行时检查注释和插入垫片来工作。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多