[英]Creating a different instance of an Object with scope prototype in OSGi using Spring
[英]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);
}
}
如上所示,服務的每個實例都有一個唯一的sessionToken
和uri
。 不管實例如何,這里的@Cacheable
產生相同的緩存,因此在為一個環境調用getAppInfo()
之后,如果 appId 匹配,我會在為另一個環境調用它時得到一個緩存結果。
是否可以包含每個實例的緩存? 我研究過使用CacheResolver
,但上下文沒有提供有關實例的任何詳細信息,例如它的 sessionToken 或 uri。
使用自定義 KeyGenerator 將值放入單個緩存中,該 KeyGenerator 還通過uri
和sessionToken
區分鍵。
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.