Настройка аспектов AspectJ с помощью Spring IoC с JavaConfig?

согласно документации Spring настройка аспектов AspectJ с помощью 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 аспект написан на родном aspectj .aj синтаксис. Если он написан на Java и аннотировано с @Aspect, Я получаю следующее сообщение об ошибке:

метод aspectOf () не определен для профилировщика типов

есть ли эквивалентный способ написания этого с помощью JavaConfig для аспектов, написанных с синтаксисом @AspectJ?

2 ответов


оказывается, что есть org.aspectj.lang.Aspects класс для обеспечения именно этой цели. Похоже, что aspectOf() метод добавляется LTW, поэтому он отлично работает в конфигурации 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;
}

надеюсь, что это поможет кому-то еще в будущем.


есть ли эквивалентный способ написания этого с помощью 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;
}

на factory-method объясняется в документации в создание экземпляра статическим заводским методом.