Spring Data Redis 如何将 RedisTemplate 注入为 ListOperations 类型

问题

在 Spring Data Redis 官方文档中,能够看到这样一个常规用法:html

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:p="http://www.springframework.org/schema/p"
  xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
  <!-- redis template definition -->
  <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnectionFactory"/>
  ...

</beans>
public class Example {

  // inject the actual template
  @Autowired
  private RedisTemplate<String, String> template;

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

  public void addLink(String userId, URL url) {
    listOps.leftPush(userId, url.toExternalForm());
  }
}

代码摘自:https://docs.spring.io/spring-data/redis/docs/2.2.5.RELEASE/reference/html/#redis:templatejava

RedisTemplateListOperations 并无继承关系,这里是怎么将 RedisTemplate 注入到 ListOperations 类型上去的呢?并且不但能够将 RedisTemplate 注入到 ListOperations ,也能够注入到 ValueOperationsSetOperationsZSetOperationsHashOperations 等类型上。git

PropertyEditor

Spring 框架能够经过 java.beans.PropertyEditor 接口的实现类来实现类型转换。github

Spring Data Redis 提供了 ListOperationsEditor 能够将 RedisTemplate 转为 ListOperationsredis

class ListOperationsEditor extends PropertyEditorSupport {

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

代码摘自:https://github.com/spring-projects/spring-data-redis/blob/2.2.5.RELEASE/src/main/java/org/springframework/data/redis/core/ListOperationsEditor.javaspring

以上代码中,RedisOperationsRedisTemplate 的父级接口,((RedisOperations) value).opsForList() 实际上就是调用 RedisTemplate.opsForList() 获取 ListOperations微信

Spring 如何注册 PropertyEditor

Note also that the standard JavaBeans infrastructure automatically discovers PropertyEditor classes (without you having to register them explicitly) if they are in the same package as the class they handle and have the same name as that class, with Editor appended. For example, one could have the following class and package structure, which would be sufficient for the SomethingEditor class to be recognized and used as the PropertyEditor for Something-typed properties.

摘自:https://docs.spring.io/spring/docs/5.2.4.RELEASE/spring-framework-reference/core.html#beans-beans-conversionapp

文档中提到,若是 PropertyEditor 类与它们处理的类在同一个包中,而且类名再加上 Editor 后缀,则无需显式注册,该 PropertyEditor 能够被自动发现。框架

在 Spring Data Redis 源码中能够看到,ListOperations 类和 ListOperationsEditor 都在 org.springframework.data.redis.core 包下,且 ListOperationsEditor 符合命名规则,即在 ListOperations 类名上加上 Editor 后缀,因此能够自动发现并生效。url

关注我

关注微信公众号

相关文章
相关标签/搜索