2016-04-20 4 views
3

Say I 2 verschiedene Bean-Methoden, die ich von ehcache gecached werden sollen:Wie zwei verschiedene Bean-Methoden im selben ehCache zwischengespeichert werden?

@Component 
public class StatService { 

@Cacheable(value = "statCalc") 
public int getMeth1(int param) { 
    // LOGIC1 
} 

@Cacheable(value = "statCalc") 
public int getMeth2(int param) { 
    // LOGIC2 
} 
} 

Ich möchte wohnen sie in gleichen Cache - ehcache.xml:

<cache name="statCalc" 
     ... 
/> 

Das Problem ist, dass Cache-Schlüssel Wird von Eingabeparametern und nicht von Methodensignatur generiert, daher kann getMeth2 (1) den von getMeth1 (1) zwischengespeicherten Wert zurückgeben.

Was ist der einfachste Weg, Schlüssel mit Methodennamen zu erstellen?

P.S. Bitte erwähnen Sie nicht die Tatsache, dass die Verwendung desselben Cache für verschiedene Methoden falsch sein könnte, helfen Sie einfach, dieses Problem zu lösen.

+0

Wie wird der Schlüssel generiert? –

+0

@RomanC Standardmäßig Schlüsselgenerator, der alle Eingabeparameter verwendet. – corvax

Antwort

3

Verwenden Sie benutzerdefinierte KeyGenerator, z.

public class CustomKeyGenerator implements KeyGenerator{ 
    @Override 
    public Object generate(Object target, Method method, Object... params) { 
     StringBuilder key = new StringBuilder(); 
     //include method name in key 
     key.append(method.getName()); 
     if (params.length > 0) { 
      key.append(';'); 
      for (Object argument : params) { 
       key.append(argument); 
       key.append(';'); 
      } 
     } 
     return key.toString(); 
    } 
} 

Register Schlüsselgenerator wie eine Bohne und @CacheKeyStrategy("keyGeneratorBeanName") Anmerkung zu den Cache gespeichert werden Methoden hinzufügen

4

Frühling Cache Abstraktion können Sie Spel verwenden, um den Cache-Schlüssel angeben. Zum Beispiel können Sie einen Methodennamen verwenden, Parameterwerte usw.

Zum Beispiel

@Component 
public class StatService { 

    @Cacheable(value="statCalc",key="#root.method.name.concat(':').concat(#param")) 
    public int getMeth1(int param) { 
     // LOGIC1 
    } 

    @Cacheable(value="statCalc",key="#root.method.name.concat(':').concat(#param")) 
    public int getMeth2(int param) { 
    // LOGIC2 
    } 
} 

Für die Methode aufrufen getMeth1 (5) wird der Schlüssel getMethod1 sein: 5 für Methode aufrufen getMethod1 (0) Schlüssel Wille be getMethod1: 0

Für den Methodenaufruf getMeth2 (3) lautet der Schlüssel getMethod2: 3. Dadurch können Sie Ergebnisse für verschiedene Parameter zwischenspeichern

Verwandte Themen