当你在 Spring 应用程序中使用 AspectJ aspect 时,自然希望并期望能够用 Spring 配置这些 aspect。AspectJ 运行时本身负责 aspect 的创建,而通过 Spring 配置 AspectJ 创建的 aspect 的方法取决于 aspect 所使用的 AspectJ 实例化模型(per-xxx 条款)。

    AspectJ 的大部分 aspect 都是 单列的 aspect。这些 aspect 的配置很简单。你可以创建一个 Bean 定义,像平常一样引用 aspect 类型,并包括factory-method="aspectOf"Bean 属性。这可以确保 Spring 通过向 AspectJ 请求获得 aspect 的实例,而不是试图自己创建一个实例。下面的例子展示了如何使用 factory-method="aspectOf"属性:

    1. <bean id="profiler" class="com.xyz.profiler.Profiler"
    2. factory-method="aspectOf">
    3. <property name="profilingStrategy" ref="jamonProfilingStrategy"/>
    4. </bean>

    非单例 aspect 更难配置。然而,通过创建多例 Bean 定义并使用 spring-aspects.jar 的 @Configurable 支持来配置 AspectJ 运行时创建的 aspectJ 实例,是可以做到的。

    如果你有一些你想与 AspectJ 编织的 @AspectJ aspect(例如,对领域模型类型使用加载时间编织)和其他你想与 Spring AOP 使用的@AspectJ aspect,并且这些 aspect 都在 Spring 中配置了,你需要告诉 Spring AOP 的 @AspectJ 自动代理支持,在配置中定义的 @AspectJ aspect 的确切子集应被用于自动代理。你可以通过在 <aop:aspectj-autoproxy/>声明中使用一个或多个 <include/>元素来做到这一点。每个 <include/>元素都指定了一个名称模式,只有名称与至少一个模式相匹配的 bean 才会被用于 Spring AOP 的自动代理配置。下面的例子展示了如何使用 <include/>元素:

    1. <aop:aspectj-autoproxy>
    2. <aop:include name="thisBean"/>
    3. <aop:include name="thatBean"/>
    4. </aop:aspectj-autoproxy>