Я кеширую данные с помощью весеннего кеша. Теперь я хочу зашифровать несколько данных перед записью в кеш и расшифровать данные во время чтения. Итак, есть ли способ написать собственный перехватчик/аоп для аннотации @cachable?
Как написать собственный перехватчик для кэша Spring (@cachable)
Ответы (1)
Вместо использования АОП вы можете просто использовать декоратор для ваших Cache
и CacheResolver
.
public class EncodingCacheResolver implements CacheResolver {
private final CacheResolver delegate;
public EncodingCacheResolver(CacheResolver delegate) {
this.delegate=delegate;
}
@Override
public Collection<? extends Cache> resolveCaches(CacheOperationInvocationContext<?> context) {
Collection<Cache> result = delegate.resolveCaches(context);
return result.stream().map(EncodingCache::new).collect(Collectors.toLlist());
}
}
Реализация кэша
public class EncodingCache implements Cache {
private final Cache delegate;
public EncodingCache(Cache delegate) {
this.delegate=delegate;
}
public String getName() {
return delegate.getName();
}
public Object getNativeCache() {
return delegate.getNativeCache();
}
public void evict(Object key) {
delegate.evict(key)
}
public void put(Object key, Object value) {
Object encodedValue = encode(value);
this.delegate.put(key, encodedValue);
}
public <T> T get(Object key, Class<T> type) {
Object encodedValue = delegate.get(key, type);
return decode(encodedValue);
}
// Other Cache methods omitted but the pattern is the same
private Object encode(Object value) {
// encoding logic here
}
private Object decode(Object value) {
// decoding logic here
}
}
Затем немного конфигурации
@Configuration
@EnableCache
public void CacheConfiguration {
@Bean
public CacheResolver cacheResolver(CacheManager cacheManager) {
return new EncodingCacheResolver(SimpleCache.of(cacheManager));
}
}
Не тестировал реализацию, набрал с головы. Но это должно быть более или менее то, что вам нужно. Вам действительно не нужен АОП для этого.
person
M. Deinum
schedule
15.09.2020
Да, это движется в правильном направлении, ИМО. Для этого не нужно создавать собственный
CacheManager
. Вы можете реализовать CacheResolver
самостоятельно и вернуть обернутый кеш на этом уровне. Отсутствие переопределения CacheManager
означает, что вы все равно можете воспользоваться тем, что Spring Boot автоматически настраивает для вас.
- person Stephane Nicoll; 22.09.2020
Это даже лучше, забыл об этом.
- person M. Deinum; 22.09.2020
Cache
, который это сделает. Для этого вам не нужен АОП. - person M. Deinum   schedule 14.09.2020