Spring注入的类型和成员变量类型不同的原理?
在看Spring Data Redis,看到RedisTemplate可以注入到ListOperations,请问这两种不同的类型是如何实现注入的?
public class Example {
// inject the template as ListOperations
// can also inject as Value, Set, ZSet, and HashOperations
@Resource(name="redisTemplate")
private ListOperations<String, String> listOps;
public void addLink(String userId, URL url) {
...
}
}
<bean id="redisTemplate"
class="org.springframework.data.redis.core.RedisTemplate"
p:connection-factory-ref="jedisConnFactory"/>
以上RedisTemplate和ListOperations是两个不同类型,为什么可以注入成功?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
转自:https://xxgblog.com/2020/03/1...
问题
在 Spring Data Redis 官方文档中,可以看到这样一个常规用法:
代码摘自:https://docs.spring.io/spring-data/redis/docs/2.2.5.RELEASE/reference/html/#redis:template
RedisTemplate
和ListOperations
并没有继承关系,这里是怎么将RedisTemplate
注入到ListOperations
类型上去的呢?而且不但可以将RedisTemplate
注入到ListOperations
,也可以注入到ValueOperations
、SetOperations
、ZSetOperations
、HashOperations
等类型上。PropertyEditor
Spring 框架可以通过
java.beans.PropertyEditor
接口的实现类来实现类型转换。Spring Data Redis 提供了
ListOperationsEditor
可以将RedisTemplate
转为ListOperations
:代码摘自:https://github.com/spring-projects/spring-data-redis/blob/2.2.5.RELEASE/src/main/java/org/springframework/data/redis/core/ListOperationsEditor.java
以上代码中,
RedisOperations
是RedisTemplate
的父级接口,((RedisOperations) value).opsForList()
实际上就是调用RedisTemplate.opsForList()
获取ListOperations
。Spring 如何注册 PropertyEditor
摘自:https://docs.spring.io/spring/docs/5.2.4.RELEASE/spring-framework-reference/core.html#beans-beans-conversion
文档中提到,如果
PropertyEditor
类与它们处理的类在同一个包中,并且类名再加上Editor
后缀,则无需显式注册,该PropertyEditor
可以被自动发现。在 Spring Data Redis 源码中可以看到,
ListOperations
类和ListOperationsEditor
都在org.springframework.data.redis.core
包下,且ListOperationsEditor
符合命名规则,即在ListOperations
类名上加上Editor
后缀,所以可以自动发现并生效。看看这个类 ListOperationsEditor
利用 PropertyEditorSupport 转换类型 (RedisTemplate -> ListOperations)