3 回答
TA贡献1812条经验 获得超5个赞
在您的特定情况下,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实例的bean不使用相同的泛型: Serializing<UserComment>inFoo和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)拥有一个能够解析类型的Resolver:
在幕后,新的ResolvableType类提供了实际使用泛型类型的逻辑。您可以自己使用它来轻松浏览和解析类型信息。ResolvableType上的大多数方法本身都会返回ResolvableType
在Spring 4之前,您还具有其他解决方法来接受Bean依赖项中的泛型类型。
真正的问题是,@Service当它是必须配置为Bean的该泛型类的实例时,您为该泛型类添加了注释, 以使其成为Bean。
因此,要实现您要执行的操作,JsonSerializer请在@Configuration类中声明要实例化的bean :
@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;
}
}
TA贡献1831条经验 获得超9个赞
您必须告诉Spring您要它自动连线的所有bean。没有例外。
如果您无法事先将其拼写清楚,那么我想说它不是注射的候选人。
您需要完全控制和通话的某些内容new
。也许您的情况就是其中之一。这没什么不对的。这仅表示Spring DI不适合该用例。
添加回答
举报