[SPRING] Java Spring AOP : CustomizableTraceInterceptor를 JavaConfig와 함께 사용 @EnableAspectJAutoProxy, XML이 아닌 <aop : advisor>
SPRINGJava Spring AOP : CustomizableTraceInterceptor를 JavaConfig와 함께 사용 @EnableAspectJAutoProxy, XML이 아닌
Spring AOP에는 CustomizableTraceInterceptor라는 메소드 레벨 추적 프로그램이있다. Spring의 XML 설정 접근 방식을 사용하면 다음과 같이이 추적 프로그램을 설정할 수 있습니다.
<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>
Spring의 JavaConfig 스타일을 사용하여 위의 구성을 설정하고 싶습니다. JavaConfig에서 AspectJ를 활성화하는 데 특히 @EnableAspectJAutoProxy와 같은 Java 주석을 사용합니다.
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = { "some.package" })
@ComponentScan(basePackages = { "some.package2", "some.package3" })
@EnableAspectJAutoProxy
public class FacebookDomainConfiguration {
@Bean someBean() {
...
}
...
}
해결법
-
==============================
1.아쉽게도 Java 언어가 Spring JavaConfig에서 이것을 지원하는 데 필요한 메소드 리터럴을 지원하지 않기 때문에 그렇게 할 수 없습니다. 이에 대한 버그가 있지만 "수정되지 않음"으로 표시되었습니다 (https://jira.springsource.org/browse/SPR-8148).
아쉽게도 Java 언어가 Spring JavaConfig에서 이것을 지원하는 데 필요한 메소드 리터럴을 지원하지 않기 때문에 그렇게 할 수 없습니다. 이에 대한 버그가 있지만 "수정되지 않음"으로 표시되었습니다 (https://jira.springsource.org/browse/SPR-8148).
버그 보고서에 언급 된 두 가지 옵션은 다음과 같습니다.
-
==============================
2.나는 이렇게 해.
나는 이렇게 해.
@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.AdrienC의 응답에 추가하고 싶었습니다. 집계 된 점, 더 명확한 분리, imho를 참조하기 위해 점 표현식을 사용하겠습니다.
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()); } }
from https://stackoverflow.com/questions/13182205/java-spring-aop-using-customizabletraceinterceptor-with-javaconfig-enableaspec by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring, Maven, Eclipses에서 XML 파일의 속성 값을 처리하는 가장 좋은 방법 (0) | 2019.01.29 |
---|---|
[SPRING] 인터페이스 레벨에서 두 클래스를 분리하면 무엇을 의미합니까? (0) | 2019.01.29 |
[SPRING] RestTemplate을 사용한 Spring 4.0.0 기본 인증 (0) | 2019.01.29 |
[SPRING] 스프링 테스트에서 @Test 메소드를 사용하기 전에 데이터베이스를 한 번만 채우는 방법은 무엇입니까? (0) | 2019.01.29 |
[SPRING] TaskScheduler, @Scheduled 및 석영 (0) | 2019.01.29 |