복붙노트

[SPRING] Spring AOP : pointcut에서 최종 클래스와 열거를 피하십시오.

SPRING

Spring AOP : pointcut에서 최종 클래스와 열거를 피하십시오.

Spring AOP를 사용하여 로깅을 구현하려고합니다. 나는 정의했다

@Pointcut("execution(* com.mycom..*(..))")
private void framework() {}

@Around("framework()")
public Object aroundAdviceFramework(ProceedingJoinPoint jp) throws Throwable {
    if (logger.isDebugEnabled())
        logger.debug("DEBUG:: {}  {}  Enter", jp.getTarget().getClass().getName(), jp.getSignature().getName());
    Object returnVal = jp.proceed(jp.getArgs());
    if (logger.isDebugEnabled())
        logger.debug("DEBUG:: {}  {}  Out", jp.getTarget().getClass().getName(), jp.getSignature().getName());
    logger.info("INFO:: " + jp.getTarget().getClass().getName() + " " + jp.getSignature().getName() + " Finished:");
    return returnVal;
}

mycom 패키지와 그 하위 패키지에는 많은 클래스가 있습니다. 일부 클래스는 열거 형 및 최종 클래스입니다. 이 때문에 나는 얻고있다

nested exception is org.springframework.aop.framework.AopConfigException: 
Could not generate CGLIB subclass of class [class com.mycom.util.BancsServiceProvider]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Cannot subclass final class class com.mycom.util.BancsServiceProvider
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:529)

어떤 종류의 정규 표현식을 사용하여 로깅에서 모든 최종 클래스와 열거 클래스를 제외시키는 방법이 있습니까? 참고 : 나는 다른 패키지에 열거 형 클래스가 있습니다. 완전한 클래스 이름을 사용하여 제외하기는 어렵습니다.

2014-11-17 업데이트 (크리가 엑스 솔루션 시도) :

나는 사용하려고

@Pointcut("!within(is(FinalType))")

하지만 다음과 같은 오류가 발생합니다.

Pointcut is not well-formed: expecting ')' at character position 10

! (내부 (FinalType))

pom 파일 에이 maven 종속성을 추가했습니다

    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.8.4</version>
    </dependency>

나는 또한이 maven 의존성을 추가했다

   <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.8.4</version>
    </dependency>

이제 모든 것이 매력처럼 작동합니다. 어떤 아이디어가 있습니까?

해결법

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

    1.현재 AspectJ 1.6.9에 도입 된 is () 포인트 컷 구문을 통해 열거 형, 측면, 인터페이스, 내부 유형, 익명 유형을 제외 할 수 있습니다. 여기에서 내 대답을 참조하십시오.

    현재 AspectJ 1.6.9에 도입 된 is () 포인트 컷 구문을 통해 열거 형, 측면, 인터페이스, 내부 유형, 익명 유형을 제외 할 수 있습니다. 여기에서 내 대답을 참조하십시오.

    현재 할 수없는 일은 AspectJ 구문을 통해 최종 유형을 제외하는 것입니다. 그러나 나는 그것이 의미가 있다고 생각하므로 티켓을 만들었습니다.

    열거 형을 제외하는 방법 :

    @Pointcut("execution(* com.mycom..*(..)) && !within(is(EnumType))")
    

    업데이트 : AspectJ 1.8.4가 릴리스되었습니다. 공식 다운로드 섹션의 개요도 참조하십시오. Maven Central에서는 다운로드를 아직 사용할 수 없지만 곧 나올 것입니다. 사용 가능한 경우이 링크는 유효하며 현재 404 오류가 발생합니다.

    그렇다면이 릴리스가 왜 흥미로운가요? 위에서 언급 한 티켓이 해결되었고 현재 사용 가능한 새로운 pointcut 프리미티브 is (FinalType)가 있으므로 1.8.4 릴리스 정보를 참조하십시오.

    이제 요청한 전체 솔루션은 다음과 같습니다.

    @Pointcut(
        "execution(* com.mycom..*(..)) && " +
        "!within(is(EnumType)) && " +
        "!within(is(FinalType))"
    )
    

    나는 그것이 이렇게 작동하는지 확인했다.

  2. from https://stackoverflow.com/questions/26676584/spring-aop-exclude-avoid-final-classes-and-enums-from-pointcut by cc-by-sa and MIT license