Какой лучший способ внедрить тот же экземпляр службы в службу Spring AOP - PullRequest
3 голосов
/ 23 февраля 2011

У меня ServiceImpl с аннотированным @Service стереотипом Spring, и в нем два метода, каждый из которых аннотирован пользовательскими аннотациями, которые перехватываются Spring.

@Service    
public class ServiceImpl implements Service{

       @CustomAnnotation
       public void method1(){
       ...
       }

       @AnotherCustomAnnotation
       public void method2(){
        this.method1();   
        ...
       }
    }
}

Теперь Spring использует прокси на основеПодход AOP и, следовательно, поскольку я использую this.method1() перехватчик для @CustomAnnotation, не сможет перехватить этот вызов. Мы использовали для внедрения этого сервиса в другой FactoryClass, и таким образом мы смогли получить экземпляр прокси как -

  @AnotherCustomAnnotation
    public void method2(){
        someFactory.getService().method1();   
        ...
    }

Я сейчас использую Spring 3.0.x, какой лучший способ получить экземпляр прокси?

Ответы [ 3 ]

3 голосов
/ 23 февраля 2011

Другой альтернативой является использование AspectJ и @Configurable.Кажется, весна приближается к этим дням (благосклонно).

Я бы посмотрел на это, если бы вы использовали Spring 3, так как он быстрее (производительность) и более гибкий, чем на основе прокси.

1 голос
/ 23 февраля 2011

Оба метода находятся внутри одного и того же прокси, тогда как функциональность AOP просто обогащает вызовы извне (см. Общие сведения о прокси AOP ).Есть три способа справиться с этим ограничением:

  1. Изменить свой дизайн (я бы порекомендовал)
  2. Изменить тип прокси сJDK-proxy для proxy-target-class (подклассы на основе CGLib) Нет, это не помогает, см. Комментарий @ axtavt, это должна быть статическая компиляция AspectJ.
  3. Использование ((Service)AopContext.currentProxy()).method1()(Работает, но является ужасным нарушением AOP, см. Конец Понимание прокси AOP )
0 голосов
/ 23 февраля 2011

Вы можете сделать так, чтобы ваш класс ServiceImpl реализовал интерфейс BeanFactoryAware и выполнял сам поиск благодаря предоставленной фабрике бинов. Но это больше не внедрение зависимостей.

Лучшее решение состоит в том, чтобы поместить method1 в другой компонент службы, который будет внедрен в существующий компонент службы и которому будет делегирован существующий компонент службы.

...