In 您的具体情况,Spring 不允许使用泛型类型作为依赖项进行连接,例如:
@Autowired
public NoteController(NoteDAO noteDAO, Serializing<UserComment> serializer) {
this.noteDAO = noteDAO;
this.serializer = serializer;
}
原因很简单:一致性。
您创建 Spring bean 所用的依赖项@Service
:
@Service
public class JsonSerializer<T extends Serializable> implements Serializing<T> {
/** code **/
}
可以连接到其他 bean 中。
想象一下依赖于Serializing
实例不使用相同的泛型:Serializing<UserComment>
in Foo
and Serializing<UserQuestion>
in Bar
例如 :
public class Foo{
@Autowired
public Foo(NoteDAO noteDAO, Serializing<UserComment> serializer) {
this.noteDAO = noteDAO;
this.serializer = serializer;
}
}
public class Bar{
@Autowired
public Bar(NoteDAO noteDAO, Serializing<UserQuestion> serializer) {
this.noteDAO = noteDAO;
this.serializer = serializer;
}
}
这里的Serializing
对象是相同的,但每个 bean 都声明了一个不同的泛型。
所以它会破坏泛型类型的类型安全。
事实上,删除仿制药并不是真正的问题,因为Spring(从 Spring 4 开始)拥有一个能够解析类型的解析器 :
在幕后,新的 ResolvableType 类提供了以下逻辑:
实际上使用泛型类型。您可以自己轻松使用
导航并解析类型信息。 ResolvableType 上的大多数方法
本身会返回一个 ResolvableType
在 Spring 4 之前,您还可以使用其他解决方法来接受 bean 依赖项中的泛型类型。
真正的问题是你用注释了一个泛型类@Service
使其成为一个 bean,同时它是必须配置为 bean 的通用类的实例。
因此,为了实现您想要做的事情,请声明JsonSerializer
你想要实例化的bean@Configuration
class :
@Configuration
public class SerializingBeans {
@Bean
public JsonSerializer<UserComment> userCommentSerializer() {
return new JsonSerializer<UserComment>();
}
@Bean
public JsonSerializer<UserAnswer> userAnswerSerializer() {
return new JsonSerializer<UserAnswer>();
}
}
您现在可以将依赖项连接为泛型类型:
@Service
public class NoteController {
private Serializing<UserComment> userCommentSerializer;
@Autowired
public NoteController(Serializing<UserComment> serializer) {
this.userCommentSerializer = serializer;
}
}