簡體   English   中英

Spring @Cacheable 對 @Scope("prototype") 實例唯一

[英]Spring @Cacheable unique to a @Scope("prototype") instance

在我的 Spring 引導應用程序中,我有一項服務用於從外部 API 檢索數據。 它使用@Scope("prototype")因為它經常調用幾個不同的環境(例如在x 和y 之間傳輸數據)。

@Component
@Scope("prototype")
public class ExternalAppConnection {
    private final URI uri;
    private final String sessionToken;

    public ExternalAppConnection(final String uri, final String sessionToken) {
        this.uri = new URI(uri);
        this.sessionToken = sessionToken;
    }

    @Cacheable
    public AppInfoResponseDto getAppInfo(Integer appId) {
        String url = buildUrl("/api/appinfo" + appId);
        return exchangeRequestForObject(url, HttpMethod.GET, AppInfoResponseDto.class);
    }
}

如上所示,服務的每個實例都有一個唯一的sessionTokenuri 不管實例如何,這里的@Cacheable產生相同的緩存,因此在為一個環境調用getAppInfo()之后,如果 appId 匹配,我會在為另一個環境調用它時得到一個緩存結果。

是否可以包含每個實例的緩存? 我研究過使用CacheResolver ,但上下文沒有提供有關實例的任何詳細信息,例如它的 sessionToken 或 uri。

使用自定義 KeyGenerator 將值放入單個緩存中,該 KeyGenerator 還通過urisessionToken區分鍵。

public class CustomKeyGenerator extends SimpleKeyGenerator {

    @Override
    public Object generate(Object target, Method method, Object... params) {
        ExternalAppConnection externalAppConnection = (ExternalAppConnection) target;
        return generateKey(
                externalAppConnection.getUri(),
                externalAppConnection.getSessionToken(),
                params);
    }
}

暫無
暫無

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

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