2017-03-16 3 views
0

J'essaie de consigner l'heure d'exécution des méthodes annotées avec une interface personnalisée. J'utilise Spring AOP.AOP pour les méthodes internes et privées Java

Mais cela ne semble pas fonctionner pour les méthodes internes.

Je pense qu'il est la limitation au printemps AOP

@Aspect 
public class BusinessProfiler { 

    private static Log log = LogFactory.getLog(BusinessProfiler.class); 


    @Around("execution(* *(..)) && @annotation(TimeLog)") 
    public Object profile(ProceedingJoinPoint point) throws Throwable { 
    long start = System.currentTimeMillis(); 
    Object result = point.proceed(); 
    String format = 
     String.format("%s#%s: took [%s msec]", point.getTarget().getClass().getSimpleName(), 
      MethodSignature.class.cast(point.getSignature()).getMethod().getName(), 
      System.currentTimeMillis() - start); 
    log.info(format); 
    return result; 
    } 

} 

Existe-t-il des alternatives que Spring AOP

Répondre

2

Si vous pensez à la façon dont les annotations AOP sont traitées au printemps, ce sera clair:

Spring prend votre classe et l'enveloppe dans un proxy avec le code supplémentaire généré à la volée par l'annotation AOP ajoutée. Donc, seul le code appelé via le proxy (c'est-à-dire provenant de l'extérieur de votre classe sera inclus).

Exemple

@Service 
public class Foo { 

    public void doSomething() { 
     doSomethinInternal(); 
    } 

    private void doSomethingInternal() { 
    } 
} 

Si d'un autre grain de printemps, je fais ceci:

@Service 
public class Bar { 

    @Autowired 
    private Foo foo; 

    public void execute() { 
     foo.doSomethinInternal(); 
    } 
} 

seulement doSomething sera appelée via le proxy qui encapsule votre classe, et non doSomethingInternal, qui sera appelé par votre classe.

+0

Merci. Existe-t-il des alternatives pour réaliser mon exigence. Je pense que ça va avec CDI. Toutes les options pour intégrer l'intercepteur CDI avec Spring – Patan

+2

Comment ce problème est-il connecté à CDI? CDI est sur l'injection de dépendance, AOP est sur l'interception de jointure. Si vous ne voulez pas modifier votre code et que vous avez besoin de capturer des classes internes, des appels de méthode via 'this' (pas via un proxy de l'extérieur) etc. vous pouvez toujours [utiliser AspectJ depuis Spring] (https: // docs. spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-using-aspectj) ou même complètement sans ressort. – kriegaex