[SPRING] Spring AOP : pointcut에서 최종 클래스와 열거를 피하십시오.
SPRINGSpring 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.현재 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))" )
나는 그것이 이렇게 작동하는지 확인했다.
from https://stackoverflow.com/questions/26676584/spring-aop-exclude-avoid-final-classes-and-enums-from-pointcut by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 프로그래밍 방식으로 Bean 검색 (0) | 2019.08.13 |
---|---|
[SPRING] Heroku의 Spring Boot Gradle 앱 : jarfile에 액세스 할 수 없습니다 (0) | 2019.08.13 |
[SPRING] ManyToMany 단방향 관계에 대한 Spring Data JPA 사양 (0) | 2019.08.13 |
[SPRING] 왜 스프링 jdbcTemplate batchUpdate 행마다 삽입 (0) | 2019.08.13 |
[SPRING] Gradle의 Spring Boot에서 Tomcat 종속성 제외 (0) | 2019.08.13 |