2012-11-01 12 views
17

Spring AOP verfügt über einen Methodenebenen-Tracer namens CustomizableTraceInterceptor. Mit Spring XML-Konfigurationsansatz, würde man diesen Indikatoren aufgebaut wie so:Java Spring AOP: Verwenden von CustomizableTraceInterceptor mit JavaConfig @EnableAspectJAutoProxy, nicht XML <aop:advisor>

<bean id="customizableTraceInterceptor" class=" 
    org.springframework.aop.interceptor.CustomizableTraceInterceptor"> 
    <property name="enterMessage" value="Entering $[methodName]($[arguments])"/> 
    <property name="exitMessage" value="Leaving $[methodName](): $[returnValue]"/> 
</bean> 

<aop:config> 
    <aop:advisor advice-ref="customizableTraceInterceptor" 
    pointcut="execution(public * org.springframework.data.jpa.repository.JpaRepository+.*(..))"/> 
</aop:config> 

Ich mag würde obige Konfiguration mit Spring einzurichten JavaConfig Art (zB Vorteil von Java-Annotationen einnehmen, vor allem @EnableAspectJAutoProxy zur Aktivierung AspectJ in JavaConfig) .

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories(basePackages = { "some.package" }) 
@ComponentScan(basePackages = { "some.package2", "some.package3" }) 
@EnableAspectJAutoProxy 
public class FacebookDomainConfiguration { 

    @Bean someBean() { 
    ... 
    } 
... 
} 

Was ist der @EnableAspectJAutoProxy -Stil Äquivalent für <aop:advisor advice-ref="customizableTraceInterceptor" ...>?

Antwort

3

Leider können Sie nicht, da die Java-Sprache keine Methodenliterale unterstützt, die in Spring JavaConfig benötigt würden, um dies zu unterstützen. Ein Bug wurde dafür geöffnet, aber als "Nicht reparieren" markiert: https://jira.springsource.org/browse/SPR-8148.

Die beiden in den Fehlerbericht genannten Optionen sind:

  1. Weiter <aop:config> Verwendung durch den entsprechenden XML-Schnipsel einschließlich @ImportResource
  2. Wandeln Sie alle vorhandenen <aop:config> elemements mit @Aspect Stil zu verwenden.
22

[was nicht möglich mit dem CustomizableTraceInterceptor ist] ich es auf diese Weise:

@Configuration 
@EnableAspectJAutoProxy(proxyTargetClass=true) 
public class TraceLoggerConfig { 

    @Bean 
    public CustomizableTraceInterceptor customizableTraceInterceptor() { 
     CustomizableTraceInterceptor customizableTraceInterceptor = new CustomizableTraceInterceptor(); 
     customizableTraceInterceptor.setUseDynamicLogger(true); 
     customizableTraceInterceptor.setEnterMessage("Entering $[methodName]($[arguments])"); 
     customizableTraceInterceptor.setExitMessage("Leaving $[methodName](), returned $[returnValue]"); 
     return customizableTraceInterceptor; 
    } 

    @Bean 
    public Advisor jpaRepositoryAdvisor() { 
     AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut(); 
     pointcut.setExpression("execution(public * org.springframework.data.jpa.repository.JpaRepository+.*(..))"); 
     return new DefaultPointcutAdvisor(pointcut, customizableTraceInterceptor()); 
    } 

} 
+3

Vielen Dank! Dies sollte als die richtige Antwort akzeptiert werden. – AndiDev

+0

Es funktioniert mit Federschuh 1.2.5 und Feder 4.1.7. – smartwjw

+0

Ich benutze diesen Code oben, aber die 'CustomizableTraceInterceptor' scheint nicht ausgelöst –

15

Nur um AdrienC Antwort hinzufügen wollte. Ich werde den Punkt Ausdruck verwenden, um einen aggregierten Punkt, mehr Reiniger Trennung, imho

package org.example; 

@Configuration 
@EnableAspectJAutoProxy 
@Aspect 
public class AopConfiguration { 
    /** Pointcut for execution of methods on {@link Service} annotation */ 
    @Pointcut("execution(public * (@org.springframework.stereotype.Service org.example..*).*(..))") 
    public void serviceAnnotation() { } 

    /** Pointcut for execution of methods on {@link Repository} annotation */ 
    @Pointcut("execution(public * (@org.springframework.stereotype.Repository org.example..*).*(..))") 
    public void repositoryAnnotation() {} 

    /** Pointcut for execution of methods on {@link JpaRepository} interfaces */ 
    @Pointcut("execution(public * org.springframework.data.jpa.repository.JpaRepository+.*(..))") 
    public void jpaRepository() {} 

    @Pointcut("serviceAnnotation() || repositoryAnnotation() || jpaRepository()") 
    public void performanceMonitor() {} 

    @Bean 
    public PerformanceMonitorInterceptor performanceMonitorInterceptor() { 
     return new PerformanceMonitorInterceptor(true); 
    } 

    @Bean 
    public Advisor performanceMonitorAdvisor() { 
     AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut(); 
     pointcut.setExpression("org.example.AopConfiguration.performanceMonitor()"); 
     return new DefaultPointcutAdvisor(pointcut, performanceMonitorInterceptor()); 
    } 
} 
+2

Meiner bescheidenen Meinung nach sollte dies als die richtige Antwort markiert werden, nur mit Frühling 4 verifiziert. :) –

+0

Vielen Dank, Männer! Ich habe genau diese Lösung seit dem Morgen gesucht!)) – Dante