3 回答

TA貢獻(xiàn)1812條經(jīng)驗 獲得超5個贊
在您的特定情況下,Spring不允許使用泛型類型作為依賴項進(jìn)行連接,例如:
@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上的大多數(shù)方法本身都會返回ResolvableType
在Spring 4之前,您還具有其他解決方法來接受Bean依賴項中的泛型類型。
真正的問題是,@Service當(dāng)它是必須配置為Bean的該泛型類的實例時,您為該泛型類添加了注釋, 以使其成為Bean。
因此,要實現(xiàn)您要執(zhí)行的操作,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>();
}
}
現(xiàn)在,您可以將依賴項作為通用類型進(jìn)行連接:
@Service
public class NoteController {
private Serializing<UserComment> userCommentSerializer;
@Autowired
public NoteController(Serializing<UserComment> serializer) {
this.userCommentSerializer = serializer;
}
}

TA貢獻(xiàn)1831條經(jīng)驗 獲得超9個贊
您必須告訴Spring您要它自動連線的所有bean。沒有例外。
如果您無法事先將其拼寫清楚,那么我想說它不是注射的候選人。
您需要完全控制和通話的某些內(nèi)容new
。也許您的情況就是其中之一。這沒什么不對的。這僅表示Spring DI不適合該用例。
添加回答
舉報