Внедрение зависимостей Spring или программирование аспектов - PullRequest
1 голос
/ 13 января 2009

Мне нужны методы в нескольких классах, которые всегда должны следовать определенному шаблону до и после.

метод public void (X x, Y y) {

// ************ Начало повторяющейся части ****************** /

AFrameworkClass aFrameworkClass = новый AFrameworkClass (this.memberVariable, "SomeString");

попробуй {

  aFrameworkClass.aFrameworkMethod( x,y); 
  aFrameworkClass.anotherFrameworkMethod(x,y); 
  aFrameworkClass.yetAnotherFrameworkMethod(x);   
  aFrameworkClass.doPreProcessing(); 

  Throwable t = null ; 

// ************ Повторение конца детали ****************** /

  try { 
     // code will vary according to the business logic 
  } 
  catch (Throwable t) { 
     // code will vary according to the business logic   
  } 

// ************ Начало повторяющейся части ****************** /

  aFrameworkClass.doPostProcessing(); 

} в конце концов { aFrameworkClass.doCleanup ();

}

// ************ Повторение конца детали ****************** /

}

Можно ли использовать Spring Framework для выполнения логики в повторяющихся частях этого метода без необходимости многократно кодировать эти строки в моих различных классах? Если так, то как?

Ответы [ 3 ]

2 голосов
/ 13 января 2009

Абсолютно это можно сделать с помощью поддержки АОП Spring. Вы можете применить первую часть как рекомендацию «до», а 2-ю - как рекомендацию «после» или вы можете применить обе рекомендации как «вокруг» и программно вызвать целевой метод следующим образом:

methodInvocation.invoke(); // returns Object

Если вы хотите объявить свои аспекты в XML, вы можете прочитать о том, как это сделать, здесь:

http://static.springframework.org/spring/docs/2.5.x/reference/aop.html#aop-schema http://static.springframework.org/spring/docs/2.5.x/reference/aop.html#aop-schema-advice-before http://static.springframework.org/spring/docs/2.5.x/reference/aop.html#aop-schema-advice-after-finally http://static.springframework.org/spring/docs/2.5.x/reference/aop.html#aop-ataspectj-around-advice

Или, если вы хотите сделать это с аннотациями, здесь есть информация:

http://static.springframework.org/spring/docs/2.5.x/reference/aop.html#aop-ataspectj

Лично я предпочитаю делать это с XML, поскольку поведение аспектов может быть изменено без перекомпиляции приложения. Допустим, у вас есть многомодульный проект, где B зависит от A. A содержит рекомендации многократного использования и использует аннотации для порядка, точечных обозначений и т. Д. Если вам нужно изменить это поведение, необходимо перестроить A. Если вы используете XML в проекте B чтобы настроить аспект из проекта A, перестройка A не требуется.

Мне кажется, что совет более пригоден для повторного использования, когда вы определяете поведение в классе и то, как это поведение применяется в XML.

1 голос
/ 13 января 2009

В качестве альтернативы полноценному контейнеру IoC, вы можете достичь того же, используя делегат. Разработайте базовый класс с пре- и пост-функциями и делегатом для внедрения вашей изменяющейся функции бизнес-логики. Функция базового класса «RunProcess» будет вызывать предоперации, делегат, затем постоперации.

0 голосов
/ 13 января 2009

brd6644 - это правильно, но я обнаружил одну проблему - проблема с Spring AOP заключается в том, что советы / советники нельзя применять к свойствам при создании объекта.

То есть, скажем, у вас есть что-то вроде

<bean class="...ProxyBeanFactory">
    <property name="target">
        <bean class="myBean">
            <property name="username" value="helloKitty"/>
            <property name="password" value="lkajdahdkahjdkhja"/>
        </bean>
     </property>
 </bean>

Невозможно написать советник для расшифровки пароля для myBean, так как значение свойства предоставляется до создания прокси. Конечно, вы не можете применить свойство пароля к классу ProxyBeanFactory. Что вы действительно хотите сделать, так это вызвать setPassword () для объекта, возвращенного из ProxyBeanFactory с аргументом «lkaj ...», но это не представляется возможным.

...