簡體   English   中英

EnableLoadTimeWeaving Spring Boot嵌入式Tomcat

[英]EnableLoadTimeWeaving Spring Boot Embedded Tomcat

緩存方面在啟用SpringTime和啟用了LoadTimeWeaving的嵌入式tomcat的情況下,在運行時不會產生任何影響,但是我們看到在日志中進行編織的情況很好。

下面是配置,啟用了LoadTimeWeaving以及作為AspectJ進行緩存的模式

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

Spring Agent -javaagent:../../../ spring-instrument-4.3.3.RELEASE.jar

日志

[RestartClassLoader@2aaae670] debug weaving 'uk.co.loyalty.iss.newpro.reporting.domain.refdata.gateway.RestReferenceDataGateway'
[RestartClassLoader@2aaae670] 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)
[RestartClassLoader@2aaae670] 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)
[RestartClassLoader@2aaae670] **debug generating class** 'uk.co.loyalty.iss.newpro.reporting.domain.refdata.gateway.RestReferenceDataGateway$AjcClosure1'
[RestartClassLoader@2aaae670] 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,但這仍然無濟於事。

在對加載時間編織進行進一步分析時,我注意到了以下行為。 我對應用程序進行了概要分析,並在類加載器上進行了研究,以確保編織正確完成,以便緩存批注可以正常工作(類已轉換)。 我注意到對於類加載器中的某些類,我們有一個帶后綴的類($ AjcClosure,在編織完成后將它們轉換為類)。 因此,如果cachinng注釋是這些編織類的一部分,則它可以正常工作。 然后,我仔細查看了這些類,為什么有些類不能正確編織,而有些則不能。 然后我注意到,如果在編織發生之前就已經將類加載到了類加載器中,那么編織就不會發生。

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

在上述情況下,僅在需要此實例時(加載時進行編織和緩存的工作原理完美之后),將類AServiceImpl加載到類加載器。 但是,如果使用@Component初始化相同的類,則不會被編織。

@Service
public class AServiceImpl{
}

我認為,在上述情況下,將類AServiceImpl加載到類加載器中,同時彈簧容器初始化,並在此之后嘗試織入加載時間。

我也在類加載器中再次驗證了此行為。 因此,如果aspectj嘗試編織一個已經加載的類,這是一個問題嗎? 以下鏈接在Spring Jira中也提出了相同的問題。

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

如上面的鏈接所述,如果我像下面那樣將aspectj weaver作為java代理傳遞,那么所有類都將被正確編織。 因此,是需要兩個代理還是我們有其他選擇。

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

是的,在類加載器加載編織目標之前 ,編織器需要處於活動狀態。

現在,我是一個AspectJ怪胎,但不是容器怪胎,我主要使用Java SE而不使用容器。 請嘗試同時添加

-javaagent:path/to/aspectjweaver.jar

到命令行,看看是否有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM