Spring AOP аспект используется в отдельном модуле - PullRequest
2 голосов
/ 17 октября 2011

У меня есть аспект com.x.NiceAspect в одном модуле проекта maven и класс com.x.NiceClass в отдельном модуле maven. Эти модули имеют одного и того же родителя POM, вместе создавая один проект.

Я пытаюсь добиться универсального аспекта, который я могу включить во все мои модули maven в этом проекте.

Теперь pointcut в NiceAspect - это: выполнение (* com.x .. .set (..)) означает все методы сеттера в моем пакете.

Я хочу, чтобы этот аспект работал со вторым модулем, особенно для присоединения к NiceClass

Как мне этого добиться?

Кроме того, предположим, что Аспекту нужен аргумент класса, который определен во втором модуле, и я получаю циклическую зависимость.

Любая помощь приветствуется

С уважением,

х. * * Тысяча двадцать-одна

Ответы [ 2 ]

0 голосов
/ 17 октября 2011
  • Я хочу, чтобы этот аспект выполнялся со вторым модулем, особенно для присоединения к NiceClass

    Если pointcut соответствует методу из «другого» модуля, аспектбудет применяться.Вам не нужно делать ничего особенного, кроме правильной настройки ваших зависимостей.например, ваша конфигурация AOP будет импортирована глобально.

  • Кроме того, предположим, что Aspect хочет аргумент класса, который определен во втором модуле, тогда я получаю циклическую зависимость..

    Зависимость аспекта от аргумента класса не должна приводить к циклической зависимости, поскольку у вас есть родительский POM, который соединяет два, а во время выполнения оба модуля находятся в пути к классам.

В общем, рекомендуется следовать структуре Aspect, как описано в документации Spring => создать общий аспект SystemArchitecture, а затем добавить более узкие аспекты области по мере необходимости:

@Aspect
public class SystemArchitecture {

  /**
   * A join point is in the web layer if the method is defined
   * in a type in the com.xyz.someapp.web package or any sub-package
   * under that.
   */
  @Pointcut("within(com.xyz.someapp.web..*)")
  public void inWebLayer() {}

  /**
   * A join point is in the service layer if the method is defined
   * in a type in the com.xyz.someapp.service package or any sub-package
   * under that.
   */
  @Pointcut("within(com.xyz.someapp.service..*)")
  public void inServiceLayer() {}

  /**
   * A join point is in the data access layer if the method is defined
   * in a type in the com.xyz.someapp.dao package or any sub-package
   * under that.
   */
  @Pointcut("within(com.xyz.someapp.dao..*)")
  public void inDataAccessLayer() {}

  /**
   * A business service is the execution of any method defined on a service
   * interface. This definition assumes that interfaces are placed in the
   * "service" package, and that implementation types are in sub-packages.
   * 
   * If you group service interfaces by functional area (for example, 
   * in packages com.xyz.someapp.abc.service and com.xyz.def.service) then
   * the pointcut expression "execution(* com.xyz.someapp..service.*.*(..))"
   * could be used instead.
   *
   * Alternatively, you can write the expression using the 'bean'
   * PCD, like so "bean(*Service)". (This assumes that you have
   * named your Spring service beans in a consistent fashion.)
   */
  @Pointcut("execution(* com.xyz.someapp.service.*.*(..))")
  public void businessService() {}

  /**
   * A data access operation is the execution of any method defined on a 
   * dao interface. This definition assumes that interfaces are placed in the
   * "dao" package, and that implementation types are in sub-packages.
   */
  @Pointcut("execution(* com.xyz.someapp.dao.*.*(..))")
  public void dataAccessOperation() {}

}

Таким образом, любые будущие аспекты, которые вам могут понадобиться, могут повторно использовать подход всей системной архитектуры, а также жить вместе с фактическим модулем, к которому они применяются.

0 голосов
/ 17 октября 2011

Если у вас все ваши проекты, объявленные как субпроекты в основной помпе, тот, который содержит аспект (и, следовательно, сам аспект), будет доступен для двух других, и в основном любой из подпроектов будет зависеть от других подпроектов..

У вас не будет циклической зависимости из-за упаковки:

  • , если вы упакуете любой из ваших объектов как исполняемый файл jar, то для того, чтобы он запустил васнеобходимо добавить jar двух других подобъектов к первому пути класса, когда вы запустите его

  • , если вы упакуете любой из ваших подпроектов как войну (а два других как jars), тогда когдаУпаковка с maven. Два других jar подпроекта будут добавлены в папку lib войны, эффективно делая их доступными для classpath войны во время выполнения.

...