@DeclareMixin с Spring AOP?

Можно ли использовать @DeclareMixin с Spring AOP? Или они поддерживают только @DeclareParents?

Я хочу написать аспект, который смешивает java.beans.PropertyChangeSupport с java bean-компонентом:

public class PropertyChangeSupportWithInterface extends PropertyChangeSupport
    implements IObservableBean {

  public PropertyChangeSupportWithInterface(Object sourceBean) {
    super(sourceBean);
  }    
}

(IObservableBean просто содержит все общедоступные методы из PropertyChangeSupport)

@Aspect
@Named
public class ObservableAspect{
    @DeclareMixin("@ObservableBean *")
    public static IObservableBean createDelegate(Object object) {
      return new PropertyChangeSupportWithInterface(object);
    }
}

Кажется, что этот аспект никогда не используется, что заставляет меня думать, что @DeclareMixin не поддерживается ткачеством времени выполнения, выполненным Spring AOP.

Есть ли способ заставить это работать с Spring AOP?

Здесь вы можете найти (не) работающий пример (многомодульный проект Maven):

https://github.com/BernhardBln/SpringAOPObservableBean

См. (Единственный) тестовый пример в подмодуле springaop-observable-bean-aspect.


person Bernhard    schedule 11.01.2014    source источник


Ответы (1)


Нет, Spring AOP из коробки не поддерживает. Я вижу два варианта:

  • Создайте DeclareMixinIntroductionInterceptor для Spring AOP.
  • Переключиться на Aspectj

Я думаю, что PropertyChange интерфейс лучше подходит для Aspectj, потому что обычно вы создаете множество прокси для прототипов bean-компонентов, и их можно легко создать вне фреймворка, например, с помощью ORM.

Изменить

Однако меня тоже интересует эта функция, и я уже проделал некоторую работу по ее использованию:

Чтобы использовать его, вам нужно только объявить bean-компонент типа DeclareMixinAutoProxyCreatorConfigurer для настройки AnnotationAwareAspectJAutoProxyCreator с AdvisorFactory выше.

Я просто тестирую, но вроде все нормально работает.

person Jose Luis Martin    schedule 15.01.2014
comment
Привет, Хосе, большое спасибо за ваш код! Но как использовать перехватчик в Spring? Я использую обработку на основе аннотаций. Или это можно сделать только через xml? - person Bernhard; 18.01.2014