不同的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会破坏物件的封装性。