不同的 AOP 框架会有其对 AOP 概念的不同实作方式,主要的差别在于所提供的 Joinpoints、Aspects 的丰富程度,以及它们如何被缝合(Weave)至应用程式之上(像是 Pointcuts 的定义方式)。
Spring 的 Advices 是用 Java 程式语言来撰写,而不使用特定的 AOP 语言,在定义 Pointcuts 时可 以使用 XML 组态档案,这两者的撰写 对于 Java 开发人员来说都很熟悉,您不必学习特定的语法, 就可以用熟悉的 Java 程式语言与 XML 格式来运用 Spring AOP。
Spring 的 AOP 实作中会实作 AOP Alliance(http://www.sourceforge.net/projects/aopalliance)所规 范的介面,AOP Alliance 是由许多团体所组成的联合计划(Joint project),这些团体对于 AOP 的 实作要求必须遵合所制订出来的介面规范,目的是对 Java 的 AOP 实作介面标准化,以增加 AOP 实作类别在不同的 Java 应用程式之间的可移植性。
Spring 的 Advices 是在执行时期导入至 Targets,您可以让 Targets 实作预先定义好的介面,则 Spring 在执行时期会使用 java.lang.reflect.Proxy 来进行动态代理,如果不实作介面,则 Spring 会使用 CGLIB 为您的 Targets 产生一个子类别作 为代理类别(Proxy classes)。
在 Spring AOP 中,您应该以实作介面的方式为优先,这可以让应用程式的元件彼此之间的耦合 度降低,使用 Proxy classes 的方式,由于必须产生子类别,所以对于被宣告为 final 的方法无法 进行代理,而且这个方式基本上是让一些无法更动原始码的第三方 (Third‐party)类别或是遗 产类别(Legacy classes)来使用。
Spring 的只支援方法的 Joinpoints,也就是 Advices 将在方法呼叫的前后被应用,Spring 不支援 Field 成员的 Jointpoints,这是因为在 Spring 的设计哲学中认为,支援 Field 成员的 Joinpoints 会破坏物 件的封装性。