2010-08-24 23 views
1

Мне нужно записать много классов в некоторые пакеты в проекте, который я не могу изменить его исходный код. Так что мне нужно решение, которое я могу указать имя пакета, и с помощью Spring aop добавить запись в классы этого пакета без их изменения, но я не знаю, как это сделать. Как я могу это сделать?Регистрация весов по имени пакета

ответ

1

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

В этом аспекте в уведомлении @AspectJ (это стиль, который совместим как с «реальным AspectJ», так и с Spring AOP, читайте о разнице in the spring reference), которую вы можете использовать как в кодовых словах Spring AOP, так и в AspectJ:

@Aspect 
public class LoggingAspect{ 

    @Pointcut("execution(* com.mycompany.myproject.*.*(..))") 
    public void methodToLog(){ 
    }; 

    @Around("methodToLog()") 
    public Object logMethod(final ProceedingJoinPoint joinPoint) throws Throwable{ 
     final StaticPart staticPart = joinPoint.getStaticPart(); 
     final String sig = 
      "" + staticPart.getSignature() + " with args: " 
       + Arrays.deepToString(joinPoint.getArgs()); 
     System.out.println("Entering method " + sig); 
     final Object result = joinPoint.proceed(); 
     System.out.println("Leaving method " + sig); 
     return result; 
    } 

} 

Вот глупый класс с некоторыми методами:

package com.mycompany.myproject; 
public class Dummy1{ 

    public static void main(final String[] args){ 
     final Dummy1 dummy = new Dummy1(); 
     dummy.doSomeStuff(); 
     dummy.doSomeStuffWithSomeArgs("Hello", 123); 
    } 

    private void doSomeStuff(){} 

    public void doSomeStuffWithSomeArgs(final String firstArg, 
     final int secondArg){} 

} 

при запуске этого класса в Eclipse,/AJDT в качестве приложения Java/AspectJ, вы получите следующий результат:

Entering method void com.mycompany.myproject.Dummy1.main(String[]) with args: [[]] 
Entering method void com.mycompany.myproject.Dummy1.doSomeStuff() with args: [] 
Leaving method void com.mycompany.myproject.Dummy1.doSomeStuff() with args: [] 
Entering method void com.mycompany.myproject.Dummy1.doSomeStuffWithSomeArgs(String, int) with args: [Hello, 123] 
Leaving method void com.mycompany.myproject.Dummy1.doSomeStuffWithSomeArgs(String, int) with args: [Hello, 123] 
Leaving method void com.mycompany.myproject.Dummy1.main(String[]) with args: [[]] 

Для проверки этого в Spring AOP потребуется больше работы (основной метод подхода не будет работать, вам придется создать ApplicationContext и зарегистрировать компонент типа Dummy1, на который вы будете называть методы), поэтому я оставлю это вам, но я уверен, что вызов частного метода не будет зарегистрирован.

Если вы загружаете SpringSource Tool Suite, вы получаете отличные инструменты для визуализации и тестирования аспект. Вы также должны прочитать AspectJ book, даже если вы хотите использовать Spring AOP. Это отличная книга.


BTW: вы, очевидно, захотите использовать настоящий регистратор, а не system.out. Вы можете определить один для каждого аспекта или (только с реальным аспектом j), вы можете представить его как статический член в целевом классе, чтобы получить ведение журнала за класс. Убийственная особенность AspectJ, на мой взгляд.

Смежные вопросы