Одит на метода на изпълнение с пружина, аспект и анотация

Имам въпрос относно това как да направя одит на ефективността на времето върху метод, използвайки анотации, aspectj и spring

по принцип имам:

 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 е на classpath, вие сте публикували действителен код и така нататък? Публикувайте целия този код в 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. имате нужда от библиотечните зависимости: aspectjrt aspectjweaver spring-aop заедно с други зависимости от spring като spring контекст и т.н.

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. уверете се, че вашият пролетен контекст сканира вашите пакети, където имате аспекта, а също и пакета, където имате анотирания клас. Или можете да ги декларирате като бобове в контекстна конфигурация на пролетта.

  2. Уверете се, че сте активирали AOP. Имате нужда от нещо подобно във вашата пролетна конфигурация:

       <?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