2015-09-17 12 views
10

Ich habe überall online nach einer einfachen Antwort auf die obige Frage gesucht, und kann es einfach nicht finden. Ich habe eine Methode wie:Was macht Spring @Cacheable, wenn er auf eine Methode gesetzt wird, die eine Liste zurückgibt?

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

Ich verwende ehcache 2.10.0 mit Spring Framework 4.2.1, und ich kann die folgende Ausgabe für diese Methode finden Sie unter:

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

auch (in späteren Logging)

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

Was ist die @Cacheable Anmerkung soll in dieser Situation tun? Legen Sie jedes Objekt in den Cache, der durch hashCode getastet wird (wie an anderer Stelle angedeutet)? Oder plonk einfach die ganze Liste in den Cache unter einem listenbasierten HashCode?

Antwort

8

The Spring Doc erwähnt dies:

Da Caches im wesentlichen Schlüsselwertspeicher sind, wobei jeder Aufruf einer gecachten Methode muss in einen geeigneten Schlüssel für die Cache-Zugriffs übersetzt werden. Out of the box, die Caching-Abstraktion verwendet einen einfachen KeyGenerator basierte auf dem folgenden Algorithmus:

  • Wenn kein params gegeben ist, zurückkehren 0

  • Wenn nur eine param ist gegeben, geben Sie diese Instanz zurück

  • Wenn mehr als der eine Parameter angegeben ist, geben Sie einen Schlüssel zurück, der aus den Hashwerten aller Parameter berechnet wurde.

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

Wenn Sie es mit @Cacheable(cacheNames = "objects") mit Anmerkungen versehen geben Sie es einen Cache-Namen, gegen die sie den Cache identifizieren kann. Da Ihre Methode keine Argumente hat, hat sie für den Cache-Namen als "Objekte" bereits das Rückgabeobjekt (List<Object> in diesem Fall) zwischengespeichert. und jedes Mal, wenn die Methode aufgerufen wird, wird der Cache mit dem Objekt cacheName und mit dem Schlüsselwert als '0' überprüft. Wenn es bereits ein Rückgabeobjekt hat, das zuvor zwischengespeichert wurde, wird das Objekt zurückgegeben.

+0

Also wird es die gesamte Liste beim zweiten Aufruf der Methode get() zurückgeben? – ben3000

+0

Ja würde es. Da die Methode bereits ausgeführt wurde, wird das Objekt zwischengespeichert. Bitte beachten Sie, dass Ihre Methode auch öffentlich sein muss. –

+1

Können einzelne Objekte in der Liste unter separaten Schlüsseln zwischengespeichert werden? – ben3000