2015-09-17 21 views
10

Szukam wszędzie prostej odpowiedzi na powyższe pytanie i po prostu nie mogę jej znaleźć. Mam metody takie jak:Co robi Spring @Cacheable po umieszczeniu metody zwracającej listę?

@Cacheable(cacheNames = "objects") 
public List<Object> get() { .. } 

używam ehcache 2.10.0 z Spring Framework 4.2.1, i widzę następujące dane wyjściowe dla tego sposobu:

Adding cacheable method 'get' with attribute: [CacheableOperation[public java.util.List com.example.DAO.get()] caches=[objects] | key='' ... 

również (później rejestrowanie)

Computed cache key 'SimpleKey []' for operation ... 

Jaki jest @Cacheable adnotacja powinien zrobić w tej sytuacji? Umieścić każdy obiekt w pamięci podręcznej z kluczem hashCode (jak wskazano w innym miejscu)? Lub po prostu plonk całą listę jako jest w pamięci podręcznej w niektórych hashCode na liście?

Odpowiedz

8

The Spring Doc wspomina o tym:

Od buforuje są zasadniczo przechowuje klucz-wartość, każde wywołanie metody z pamięci podręcznej musi zostać przetłumaczony na odpowiednim kluczu cache dostępu. Po wyjęciu z pudełka, abstrakcja buforowania używa prostego KeyGenerator oparciu o następujący algorytm:

  • Jeżeli nie params podano, wróć 0

  • Jeśli tylko jedna podano parametr, zwróć ten instancję:

  • Jeśli podano więcej niż jeden parametr, zwróć klucz obliczony na podstawie skrótów wszystkich parametrów.

http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/cache.html

Podczas opisywania go @Cacheable(cacheNames = "objects") dać mu nazwę cache, przeciwko któremu można go zidentyfikować cache. Ponieważ twoja metoda nie ma żadnych argumentów, dla cacheName jako "objects", będzie już buforował obiekt return (List<Object> w tym przypadku). i za każdym razem, gdy metoda zostanie wywołana, sprawdzi pamięć podręczną za pomocą obiektu cacheName, a kluczową wartość jako "0". Jeśli ma już obiekt zwracany, który był wcześniej zapisany w pamięci podręcznej, zwróci obiekt.

+0

Tak więc zwróci całą listę na drugim wywołaniu metody get()? – ben3000

+0

Tak, to by było. Ponieważ ma już rekord, że metoda została wykonana, obiekt jest buforowany. Pamiętaj, że twoja metoda musi być również publiczna. –

+1

Czy poszczególne obiekty na liście mogą być buforowane pod oddzielnymi klawiszami? – ben3000