Аудит метода производительности с помощью Spring, Aspectj и аннотаций

У меня есть вопрос о том, как провести аудит производительности по методу с использованием аннотаций, аспектов и пружин.

в основном у меня есть:

 public class MyClass{

 @TimeAudit
 public myMethod(){
  //do something
 }
}

я хочу просто регистрировать (или просто печатать его в консоли) время, затраченное на выполнение этого метода. Моя проблема заключается в том, как аспект перехватит эту аннотацию и после этого подсчитает время, затраченное этим методом.

Как я могу это сделать? чтобы немного уточнить мой вопрос: у меня есть аннотация:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface TimeAudit {

}

у меня есть свой аспект:

@Aspect
@Component
public class PerformanceTimeExecutionAudit {

     @Around("execution(* *(..)) && @annotation(timeAudit)")
     public Object doLogTime(final ProceedingJoinPoint pjp, TimeAudit timeAudit) throws Throwable {

    System.out.println("Start time..."+System.currentTimeMillis());
    Object output = pjp.proceed();
    System.out.println("End time..."+System.currentTimeMillis());

    return output;
}
}

в другом классе:

 @Repository
 public class MyClass{ 
 @Override
 @TimeAudit
  public void myMethod(){
    //do something
   }
 }

но аспект не запускается для этого метода, если я поставил @TimeAudit. Что я делаю неправильно?


person DanutClapa    schedule 10.07.2015    source источник
comment
Perf4J.   -  person manish    schedule 10.07.2015
comment
спасибо за это, кажется, это измерение производительности. Но я хочу посмотреть, как я могу это сделать.   -  person DanutClapa    schedule 10.07.2015
comment
Вы можете проверить исходный код Perf4J. Аннотация @Profiled находится в пакете aop. Это вызывает ProfiledTimingAspect, который также находится в том же пакете. Отсюда вы можете следовать коду, чтобы узнать, как обрабатываются фактические измерения и регистрация. Конфигурация AspectJ находится на странице, на которую я ссылался выше.   -  person manish    schedule 10.07.2015
comment
Вы включили AOP в своей конфигурации Spring? Как настроено приложение?   -  person manish    schedule 10.07.2015
comment
да .... xmlns:aop=springframework.org/schema/aop springframework.org/schema/aop springframework.org/schema/aop/spring-aop-3.0.xsd ‹aop:aspectj-autoproxy /›   -  person DanutClapa    schedule 10.07.2015
comment
И AspectJ RT находится на пути к классам, вы разместили фактический код и так далее? Разместите весь этот код на Github в виде Gist, чтобы кто-нибудь мог его посмотреть.   -  person manish    schedule 10.07.2015
comment
Что ж, после нескольких часов отладки и т. Д. Я обнаружил, что я тупой :) У меня был заголовок Spring bean, но он не сканировал мой пакет @Aspect ... потому что я пропустил это ... после того, как я также перешел на сканирование мой пакет Aspect работал очень хорошо. Спасибо за огромную поддержку, которую вы мне оказали...   -  person DanutClapa    schedule 10.07.2015
comment
Пожалуйста, напишите свой собственный ответ, содержащий конфигурацию Spring, и примите его, чтобы закрыть вопрос или просто удалить вопрос - все, что вам кажется более подходящим.   -  person kriegaex    schedule 11.07.2015


Ответы (1)


Подводя итог, краткое руководство по созданию аспекта в сочетании с аннотацией будет полезно для новичков в этой области.

  1. вам нужны зависимости библиотеки: аспект jrt, аспект jweaver spring-aop вместе с другими зависимостями весны, такими как контекст весны и т. д.

2 Создайте свой пример аннотации:

 @Retention(RetentionPolicy.RUNTIME)
 @Target({ElementType.METHOD, ElementType.TYPE})
 public @interface TimeAudit {
  //put here whatever fields you need
 }

3 Создайте свой аспект, например:

@Aspect
@Component
public class PerformanceTimeExecutionAudit {

 @Around("execution(* *(..)) && @annotation(TimeAudit)")
 public Object doLogTime(final ProceedingJoinPoint pjp, TimeAudit timeAudit) throws Throwable {

   System.out.println("Start time..."+System.currentTimeMillis());
   Object output = pjp.proceed();
    //this is with @Around, you can use in your asspect all others annotations like @Before, @After etc. this depends on your logic behavior.
   System.out.println("End time..."+System.currentTimeMillis());

   return output;
 }
}

4 В ваших методах используйте свою аннотацию следующим образом. Небольшое наблюдение заключается в том, что вы можете создать аннотацию, чтобы она вел себя так, как вы хотите.

@Repository
public class MyClass{ 
 @Override
 @TimeAudit 
 public void myMethod(){
   //do something
 }
} 
//- this @TimeAudit can contain params, this depends on your Annotation  logic creation
  1. убедитесь, что ваш весенний контекст сканирует ваши пакеты, в которых у вас есть Aspect, а также пакет, в котором у вас есть аннотация класса. Или вы можете объявить их как bean-компоненты в конфигурации контекста Spring.

  2. Убедитесь, что вы включили АОП. Вам нужно что-то вроде этого в вашей весенней конфигурации:

       <?xml version="1.0" encoding="UTF-8"?>
       <beans xmlns="........
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation=".........
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    
     <aop:aspectj-autoproxy />
    

Вот и все. Я надеюсь, что это будет полезно для кого-то.

person DanutClapa    schedule 13.07.2015