2016-04-20 1 views
3

Dire que j'ai 2 méthodes différentes de haricots que je veux mettre en cache par ehcache:Comment mettre en cache 2 méthodes de bean différentes dans la même ehCache?

@Component 
public class StatService { 

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

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

Je veux leur résider dans la même cache - ehcache.xml:

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

Le problème est que la clé de cache est généré par les paramètres d'entrée et non par la signature de la méthode, ainsi getMeth2 (1) peut retourner la valeur mise en cache par getMeth1 (1).

Quelle est la manière la plus simple de construire une clé en utilisant le nom de la méthode?

P.S. S'il vous plaît, ne mentionnez pas le fait que l'utilisation du même cache pour différentes méthodes pourrait être fausse, juste aider à résoudre ce problème.

+0

Comment la clé est générée? –

+0

@RomanC Par générateur de clé par défaut qui utilise tous les paramètres d'entrée. – corvax

Répondre

3

Utiliser le code personnalisé KeyGenerator, par ex.

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(); 
    } 
} 

registre générateur de clé comme un haricot et ajoutez l'annotation @CacheKeyStrategy("keyGeneratorBeanName") aux méthodes cacheable

4

abstraction Spring Cache vous permet d'utiliser Spel pour spécifier la clé de cache. Par exemple, vous pouvez utiliser un nom de méthode, les valeurs des paramètres, etc.

Par exemple

@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 
    } 
} 

Pour la méthode appeler getMeth1 (5) la clé sera getMethod1: 5 Pour appeler la méthode getMethod1 (0) volonté clé get getMethod1: 0

Pour l'appel de méthode getMeth2 (3), la clé sera getMethod2: 3. Cela vous permet de mettre en cache des résultats pour différents paramètres