2012-11-01 25 views
17

स्प्रिंग एओपी में CustomizableTraceInterceptor नामक एक विधि-स्तरीय ट्रैसर है। वसंत के XML विन्यास दृष्टिकोण का उपयोग करना, एक तो इस तरह ट्रेसर सेट अप करना होगा:जावा स्प्रिंग एओपी: JavaConfig @EnableAspectJAutoProxy के साथ CustomizableTraceInterceptor का उपयोग करना, एक्सएमएल <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> 

मैं वसंत के JavaConfig शैली (यानी विशेष रूप से @EnableAspectJAutoProxy JavaConfig में AspectJ सक्रिय करने के लिए, जावा एनोटेशन का लाभ लेने) का उपयोग कर विन्यास ऊपर स्थापित करने के लिए चाहते हैं ।

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

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

<aop:advisor advice-ref="customizableTraceInterceptor" ...> के लिए @EnableAspectJAutoProxy शैली बराबर क्या है?

उत्तर

3

दुर्भाग्य से, आप ऐसा नहीं कर सकते क्योंकि जावा भाषा विधि अक्षर का समर्थन नहीं करती है जिसे स्प्रिंग जावाकॉन्फ़िग में इसका समर्थन करने के लिए आवश्यक होगा। इसके लिए एक बग खोला गया था लेकिन "ठीक नहीं होगा" के रूप में चिह्नित किया गया: https://jira.springsource.org/browse/SPR-8148

दो विकल्प बग रिपोर्ट में बताया गया हैं:

  1. का उपयोग कर @ImportResource
  2. किसी भी मौजूदा <aop:config> elemements कन्वर्ट @Aspect शैली का उपयोग करने के लिए प्रासंगिक एक्सएमएल स्निपेट शामिल द्वारा <aop:config> उपयोग करना जारी रखें।
22

मैं इसे इस तरह से करना [जो CustomizableTraceInterceptor साथ संभव नहीं है]:

@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

धन्यवाद बिंदु अभिव्यक्ति उपयोग करेंगे! इसे सही उत्तर के रूप में स्वीकार किया जाना चाहिए। – AndiDev

+0

यह वसंत बूट 1.2.5 और वसंत 4.1.7 के साथ काम करता है। – smartwjw

+0

मैं उपरोक्त इस कोड का उपयोग करता हूं लेकिन 'CustomizableTraceInterceptor' को –

15

बस AdrienC की प्रतिक्रिया में जोड़ने के लिए चाहता था। मैं एक समग्र बिंदु है, और अधिक स्पष्ट जुदाई, संदर्भ के लिए 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

ट्रिगर नहीं किया गया है मेरी विनम्र राय में, इसे सही उत्तर के रूप में चिह्नित किया जाना चाहिए, बस वसंत 4 के साथ सत्यापित किया गया है :) :) –

+0

धन्यवाद पुरुषों! मैं सुबह से ही इस समाधान को खोज रहा था!)) – Dante