2017-09-28 5 views
0

Je suis étonné avec ce type d'injection de dépendance représenté à titre d'exemple dans les données ressort Redis: https://docs.spring.io/spring-data/data-redis/docs/current/reference/html/#redis:serializerPuzzled avec injection @Resource avec attribut de nom

// inject the template as ListOperations 
    @Resource(name="redisTemplate") 
    private ListOperations<String, String> listOps; 

Prenant en considération le fait que redisTemplate est un bean de type RedisTemplate , comment spring parvient-il à récupérer les listOps du beans redisTemplate?

Cela fonctionne et je suis principalement intéressé par trouver une pièce de documentation expliquant ce comportement ou le morceau de code manipulant cela.

Merci pour votre aide.

+0

Jetez un coup d'oeil dans [ce poste] (http://www.baeldung.com/spring-annotations-resource-inject-autowire) – juanlumn

+1

Il ne fonctionne pas. 'RedisTemplate' implémente l'interface' ListOperations'. –

+0

RedisTemplate n'implémente pas ListOperations. Juste trouvé la réponse ici: https://stackoverflow.com/questions/43006197/why-a-redistemplate-can-convert-to-a-listations – asanglard

Répondre

0

En fait, cela fonctionne grâce à la classe ListOperationsEditor.

class ListOperationsEditor extends PropertyEditorSupport { 
    ListOperationsEditor() { 
    } 

    public void setValue(Object value) { 
     if(value instanceof RedisOperations) { 
      super.setValue(((RedisOperations)value).opsForList()); 
     } else { 
      throw new IllegalArgumentException("Editor supports only conversion of type " + RedisOperations.class); 
     } 
    } 
}