Spring AOP и AspectJ. Нужен совет / комментарии на Around Advice - PullRequest
0 голосов
/ 23 сентября 2011

Я разместил это на другом форуме и хотел посмотреть, смогу ли я привлечь больше людей.

Я работаю над приложением, состоящим из различных веб-приложений Spring.

Скажем, у нас есть:

  • ComponentA.jar
  • ComponentB.jar

И файлы WAR:

  • Foo.war (содержит Компонент A)
  • Baa.war (содержит ComponentA & ComponentB)

Мы используем Logback для входа в наш журнал отладки. Итак, скажем, что различные классы приложения имеют следующее объявление логгера:

private static final Log log = LoggerFactory.getLogger(NAME_OF_WAR_FILE + "." + NAME_OF_CONTAINING_COMPONENT + "." + PACKAGE.CLASS_NAME);

Пример:

package a.b.c;

public class SomeClass {
   private static final Log log = LoggerFactory.getLogger("Foo.war" + "." + "ComponentA" + "." + SomeClass.class);
}

package x.y.z;

public class SomeOtherClass {

   private static final Log log = LoggerFactory.getLogger("Baa.war" + "." + "ComponentA" + "." + SomeOtherClass .class);
}

Предположим, что имя файла и компонента war задается свойством, а не жестко запрограммировано.

Возможно ли иметь Аспект и Совет, который может сделать что-то вроде следующего (псевдо, так как я не уверен, что это может быть сделано):

@Aspect
public class TheAspect{

   @Around("execution of a method")
   public Object aroundSomething(ProceedingJoinPoint pjp){

      Log log = get the log instance from the class that this advice is running on

      if(log.isDebugEnabled())
         // log something

      Object o = pjp.proceed();

       if(log.isDebugEnabled())
         // log something else

     return o;

   }
}

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

Приложение представлено в виде единого веб-приложения, состоящего из Foo.war и Baa.war. И Foo.war, и Baa.war записывают в один и тот же файл журнала.

Пример:

2011-09-22 14:35:35.159 MDT,DEBUG,Foo.war.ComponentA.a.b.c.SomeClass,Hello World Debug message
2011-09-22 14:35:35.159 MDT,DEBUG,Baa.war.ComponentA.a.b.c.SomeClass,Hello World Debug message
2011-09-22 14:35:35.159 MDT,DEBUG,Baa.war.ComponentB.x.y.z.SomeOtherClass,Hello World Debug message

Заранее спасибо.

1 Ответ

0 голосов
/ 23 сентября 2011

Вы можете использовать thisJoinPoint внутри вашего aroundSomething метода.

Чтобы получить имя класса:

Signature sig = thisJoinPoint.getSignature();
String className = sig.getDeclaringTypeName();

Вы также можете получить объект класса:

Class<?> type = sig.getDeclaringType();

И, возможно, вы можете использовать пакет для идентификации вашего военного файла:

Package pack type.getPackage();
...