次のクラスとインターフェイスを使用しています(簡潔にするために簡略化されています)。デプロイ完了前にキャッシング可能なキャッシングアノテーションが機能しない
@Serivce
class Service1 {
@Cacheable("cacheName")
public Metadata preLoadMetadata() {
// load data from database
}
}
@Service
class Service2 implements Loader {
@Autowired @Lazy
private Service1 service1;
@Overrride
public CacheWrapper getCacheWrapper() {
return new CacheWrapper(() -> service1.preLoadMetadata());
}
}
interface Loader {
CacheWrapper getCacheWrapper();
}
class CacheWrapper {
private Callable callable;
public CacheWrapper(Callable callable) {
this.callable = callable;
}
public getCallable() {
return callable;
}
}
デプロイ時にキャッシュをロードするためのSpring Bean。
@Component
class LoadCache {
@Autowired
private List<Loader> allLoaders;
@PostConstruct
public void load() {
allLoaders.getCacheWrapper().getCallable().call();
}
}
preLoadMetadata()
キャッシュにデータを保存せずに実行します。デプロイメントが完了し、同じメソッドpreLoadMetadata()
を呼び出した後、データをキャッシュに保存します。
なぜ@Cacheable
は展開時に機能しませんか?
@PostConstruct
と注釈されたメソッド内に手動でput
メソッドCache
を使用してキャッシュすると、展開中に正常に実行できます。
私はサーバーとしてTomcatを使用しています。
私はSpringキャッシュ抽象化の背後にあるCouchbaseキャッシュを使用しています。
導入の途中です。 – Kayaman
@ Kayamanもしそうなら、なぜそれがプログラムでキャッシュにデータを埋め込むのですか? – rohanagarwal