使用Spring IoC和JavaConfig配置AspectJ方面?

时间:2014-04-04 02:54:15

标签: java spring aop aspectj spring-java-config

根据Spring的文档Configuring AspectJ aspects using Spring IoC为了配置Spring IOC的一个方面,必须在xml配置中添加以下内容:

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

正如@SotiriosDelimanolis所建议的那样,在JavaConfig中重写这个应该起作用:

@Bean
public com.xyz.profiler.Profiler profiler() {
    com.xyz.profiler.Profiler profiler = com.xyz.profiler.Profiler.aspectOf();
    profiler.setProfilingStrategy(jamonProfilingStrategy()); // assuming you have a corresponding @Bean method for that bean
    return profiler;
}

但是,如果Profiler方面是用native aspect .aj语法编写的,那么这似乎才有用。如果它是用Java编写的并用@Aspect注释,则会收到以下错误消息:

  

方法aspectOf()未定义类型Profiler

对于使用@AspectJ语法编写的方面,是否有使用JavaConfig编写此方法的等效方法?

2 个答案:

答案 0 :(得分:12)

事实证明,有一个org.aspectj.lang.Aspects类专门用于此目的。似乎LTW添加了aspectOf()方法,这就是为什么它在XML配置中正常工作,但在编译时却没有。

要解决此限制,org.aspectj.lang.Aspects提供了aspectOf()方法:

@Bean
public com.xyz.profiler.Profiler profiler() {
    com.xyz.profiler.Profiler profiler = Aspects.aspectOf(com.xyz.profiler.Profiler.class);
    profiler.setProfilingStrategy(jamonProfilingStrategy()); // assuming you have a corresponding @Bean method for that bean
    return profiler;
}

希望将来可以帮助其他人。

答案 1 :(得分:1)

  

是否有使用JavaConfig编写此方法的等效方法?

几乎总是。

@Bean
public com.xyz.profiler.Profiler profiler() {
    com.xyz.profiler.Profiler profiler = com.xyz.profiler.Profiler.aspectOf();
    profiler.setProfilingStrategy(jamonProfilingStrategy()); // assuming you have a corresponding @Bean method for that bean
    return profiler;
}

Instantiation with a static factory method中的文档中解释了factory-method