복붙노트

[SPRING] Java Spring AOP : CustomizableTraceInterceptor를 JavaConfig와 함께 사용 @EnableAspectJAutoProxy, XML이 아닌 <aop : advisor>

SPRING

Java 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() {
    ...
    }
...
}

에 해당하는 @ EnableAspectJAutoProxy 스타일은 무엇입니까?

해결법

  1. ==============================

    1.아쉽게도 Java 언어가 Spring JavaConfig에서 이것을 지원하는 데 필요한 메소드 리터럴을 지원하지 않기 때문에 그렇게 할 수 없습니다. 이에 대한 버그가 있지만 "수정되지 않음"으로 표시되었습니다 (https://jira.springsource.org/browse/SPR-8148).

    아쉽게도 Java 언어가 Spring JavaConfig에서 이것을 지원하는 데 필요한 메소드 리터럴을 지원하지 않기 때문에 그렇게 할 수 없습니다. 이에 대한 버그가 있지만 "수정되지 않음"으로 표시되었습니다 (https://jira.springsource.org/browse/SPR-8148).

    버그 보고서에 언급 된 두 가지 옵션은 다음과 같습니다.

  2. ==============================

    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. ==============================

    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());
        }
    }
    
  4. from https://stackoverflow.com/questions/13182205/java-spring-aop-using-customizabletraceinterceptor-with-javaconfig-enableaspec by cc-by-sa and MIT license