1、Spring AOP与AspectJ
Spring AOP与AspectJ相比,是一个功能比较弱的AOP解决方案。
AspectJ提供了许多它不能支持的类型切点,如在创建对象时应用通知,构造器切点很方便。
但是,不像某些其它面向对象语言中的构造器,Java构造器不同于其他的正常方法,这使得Spring基于代理的AOP无法把通知应用于对象的创建过程。
2、通过Spring为AspectJ的切面注入依赖
对多数功能来讲,AspectJ与Spring是相互独立的。
但是,精心设计切有意义的切面可能依赖其他类来完成工作。如在执行通知时,切面依赖与一个或者多个类。这时,我们可以借助Spring的依赖注入把bean装配进AspectJ切面中。
通常情况下,Spring bean由Spring容器初始化,但是AspectJ切面是由AspectJ在运行时创建的,等到Spring有机会为切面A注入它的依赖B时,A已经被实例化了。(这里A是用AspectJ实现的一个切面,使用扩展的java语言)
因为Spring不负责创建A,那就不能在Spring中简单地把A声明为一个bean。相反,我们需要一种方式为Spring获得已经由AspectJ创建的A的实例的句柄,从而注入B。
考虑到这些,所有的AspectJ切面都提供了一个静态的aspectof()方法,这个方法返回切面的一个单例。
所以为了获得切面的实例,我们必须使用factory-method来调用aspectof()方法,而不是调用A的构造器方法。(A中的setter方法)
property name="B" ref="B" />
简而言之,Spring不能简单使用<bean>创建一个切面A的实例,而是通过aspectof()工厂方法获得AspectJ创建的切面的引用。