2017-12-14 22 views
0

캐싱 LoadTimeWeaving이 설정된 Spring Tomcat 및 Embedded Tomcat을 사용하면 런타임에 효과가 발생하지 않지만 로그에서 위빙이 잘 발생하는 것으로 나타납니다. ../../../ 봄 - 악기 - 4.3 : 아래 EnableLoadTimeWeaving Spring Boot Embedded Tomcat

는 LoadTimeWeaving는 캐싱

@Configuration 
    @EnableConfigurationProperties 
    @EnableSpringConfigured 
    @EnableAspectJAutoProxy(proxyTargetClass = true) 
    @EnableLoadTimeWeaving 
    @EnableTransactionManagement 
    @EnableAsync 
    @EnableCaching(mode = AdviceMode.ASPECTJ) 
    public class AppConfig { 
    } 

봄 에이전트 -javaagent를위한 AspectJ를 같은 모드와 함께 사용할 수 있습니다 구성입니다 .3.RELEASE.jar

로그

[[email protected]] debug weaving 'uk.co.loyalty.iss.newpro.reporting.domain.refdata.gateway.RestReferenceDataGateway' 
[[email protected]] weaveinfo Join point 'method-execution(java.util.List uk.co.loyalty.iss.newpro.reporting.domain.refdata.gateway.RestReferenceDataGateway.getHierarchyLevelDefns())' in Type 'uk.co.loyalty.iss.newpro.reporting.domain.refdata.gateway.RestReferenceDataGateway' (RestReferenceDataGateway.java:118) advised by around advice from 'org.springframework.cache.aspectj.AnnotationCacheAspect' (AbstractCacheAspect.aj:64) 
[[email protected]] weaveinfo Join point 'method-execution(java.util.Map uk.co.loyalty.iss.newpro.reporting.domain.refdata.gateway.RestReferenceDataGateway.getHierarchyLevelDefinitionMap())' in Type 'uk.co.loyalty.iss.newpro.reporting.domain.refdata.gateway.RestReferenceDataGateway' (RestReferenceDataGateway.java:129) advised by around advice from '**org.springframework.cache.aspectj.AnnotationCacheAspect**' (AbstractCacheAspect.aj:64) 
[[email protected]] **debug generating class** 'uk.co.loyalty.iss.newpro.reporting.domain.refdata.gateway.RestReferenceDataGateway$AjcClosure1' 
[[email protected]] debug generating class 'uk.co.loyalty.iss.newpro.reporting.domain.refdata.gateway.RestReferenceDataGateway$AjcClosure3' 

이 문제에 관해서는 많은 논의가 있습니다. RestartClassLoader에서 직조가 진행 중입니다. 클래스 로더와 관련이 있는지는 확실하지 않습니다. 또한 아래에 추가해 보았습니다.

@Bean 
     public LoadTimeWeaver loadTimeWeaver() throws Throwable { 
      InstrumentationLoadTimeWeaver loadTimeWeaver = new InstrumentationLoadTimeWeaver(); 
      return loadTimeWeaver; 
     } 

제안 사항을 제공해주십시오.

편집 우리는 개인적인 방법으로 캐싱을 사용하기 때문에 Aspectj 모드가 필요합니다. EnableAspectJAutoProxy를 제거했지만 여전히 도움이되지 않습니다.

로드 시간에 대한 추가 분석에서, 나는 아래의 행동을 발견했습니다. 애플리케이션을 프로파일 링하고 클래스 로더를 조사하여 캐싱 주석이 올바르게 작동 하는지를 확인합니다 (클래스는 trasformed 됨). 클래스 로더의 일부 클래스에서 접미사 ($ AjcClosure 클래스가 있고 클래스는 위빙이 완료된 후 변형 된 클래스입니다.)가 있습니다. 따라서 캐싱 주석이 클래스를 구성하는 클래스의 일부인 경우 올바르게 작동합니다. 그런 다음 일부 수업이 올바르게 짜여지고 일부 수업이 제대로 짜여지지 않은 수업을 자세히 들여다 보았습니다. 그런 다음 클래스가 클래스 로더에 이미로드되기 전에 weaving이 발생하지 않는다고 인식합니다. 위의 경우

@Bean 
    public IAService aService(){ 
     return new AServiceImpl(); 
    } 

이 클래스는 AServiceImpl이 인스턴스 (로드 시간 직조 후 캐싱 완벽하게 작동) 필요한 경우에만 클래스 로더에로드됩니다. 그러나 같은 클래스가 @Component를 사용하여 초기화되면 weaved되지 않습니다. 스프링 컨테이너 처음 상태와로드 시간 직물)는 그 후 짜려고 노력하는 동안

@Service 
public class AServiceImpl{ 
} 

나는 위의 경우에, 클래스 AServiceImpl는 클래스 로더에로드, 생각합니다.

클래스 로더에서도이 동작을 다시 확인했습니다. aspectj가 이미로드 된 클래스를 짜려고 할 때 문제가되는 것입니다. 같은 문제가 Spring Jira와 아래 링크에서 제기되었습니다. I는 다음과 같은 자바 제로 AspectJ의 버를 통과하면, 상술 한 바와 같이 링크

https://jira.spring.io/browse/SPR-13786

는, 모든 클래스 제대로 직조되고있다. 따라서 두 명의 에이전트가 있어야하는지 아니면 다른 에이전트가 필요합니까?

-javaagent:../../../aspectjweaver-1.6.1.jar 
-javaagent:../../../spring-instrument-4.3.3.RELEASE.jar 
+1

당신의 질문은 나를 괴롭힌다. AspectJ 또는 프록시 기반 Spring AOP에 관한 것인가? 왜냐하면'@ EnableAspectJAutoProxy' (Spring AOP)와'@ EnableLoadTimeWeaving' (AspectJ)를 모두 설정했기 때문입니다. 그 중 하나만 사용해야합니다. 어쨌든 왜 AspectJ 전체가 필요하다고 생각하니? 개인 메소드 차단, Spring AOP에서 지원되지 않는 포인트 컷 타입 등과 같은 Spring AOP에없는 기능을 사용하고 있습니까? 아니면'this.myMethod()'와 같이 타겟 클래스가 만든 내부 호출을 추적하고 싶습니까? 후자는 주석이'@EnableCaching (mode = AdviceMode.ASPECTJ)'가 제안하는 것입니다. 덕분에 @ kriegaex – kriegaex

+0

. 나는 클래스 로더가 내 질문에 세부 사항을 추가하는 줄을 따라 더 조사했다. 고맙습니다 @kriegaex – Raju

답변

0

은 예, 위버 대상이 클래스 로더에 의해로드 된 직조 전에 활성화 될 필요가있다.

이제 저는 AspectJ 괴짜지만 컨테이너 괴짜는 아닙니다. 저는 주로 Java SE와 컨테이너가 필요 없습니다. 명령 줄에

-javaagent:path/to/aspectjweaver.jar 

을 추가하고 도움이되는지 확인해보십시오.

+0

을 제안하십시오. Java Agent로 aspectjweaver-1.6.1.jar을 추가한다고 언급하면서 문제가 해결되었습니다. 이 설정은 Spring 부트의 유일한 옵션이라고 생각합니다. xml 설정이있을 때이 문제에 직면하지 않았습니다. 다시 한 번 감사드립니다 – Raju

+0

이 문제를 좀 더 자세히 조사하고 싶다면 [도움이 되었습니까?] (https://stackoverflow.com/questions/35993888) 도움이 될 수 있습니다. :-) – kriegaex