[英]Spring 4 dependency injection for abstract generic classes do not work
我有X
和Y
基類,它們具有多個實現。 但是,每種參數化類型只有一個實現,因此@Autowired
應該能夠確定需要哪個子類。
在將第二個參數U
添加到基類X
和Y
(並因此添加到它們的所有子類)之前,這實際上是可行的。 但是添加之后,這是Spring初始化期間的錯誤:
org.springframework.beans.factory.UnsatisfiedDependencyException:創建名稱為'myApp'的bean時出錯:通過字段'x1'表示的不滿足的依賴關系; 嵌套的異常是org.springframework.beans.factory.UnsatisfiedDependencyException:創建名稱為'xImpl1'的bean時出錯:通過字段y表示的不滿足的依賴關系; 嵌套的異常是org.springframework.beans.factory.NoSuchBeanDefinitionException:沒有可用的類型為“ test.Y>”的合格Bean:期望至少有1個有資格作為自動裝配候選的Bean。 依賴項注釋:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}
github(maven項目)中的代碼: https : //github.com/kevincentius/spring-di-abstract-generic-problem/tree/master/spring-test
抽象的通用類X<T, U>
和Y<T, U>
互相引用:
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public abstract class X<T, U> {
protected T t;
protected U u;
@Autowired
protected Y<T, X<T, U>> y; // error when initializing xImpl1
// ...
}
Y
類知道實現類V
(例如XImpl1
)。 與X
相對,后者僅知道抽象類Y
,但不知道其實現類型(例如YImpl1
)。
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public abstract class Y<T, V extends X<T, ?>> {
protected T t;
protected V v;
// ...
}
Pojo課:
public class A {
// pojo
}
一個簡單的界面:
public interface B {
// ...
}
這僅僅是子類的一個X
,但這是唯一的子類X
與參數化類型A
和B
(即唯一的子類X<A, B>
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class XImpl1 extends X<A, B> {
// ...
}
像上面一樣Y<A, B>
的唯一實現。 盡管Y
其他實現具有不同的參數化類型。
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class YImpl1 extends Y<A, XImpl1> {
// ...
}
最后使用實現:
@Component
public class MyApp {
@Autowired
XImpl1 x1; // error
}
可能是有用的信息:
如果我將類X和Y設為非抽象類,則初始化錯誤消失了,但是即使XImpl1覆蓋了X上的方法,在依賴項注入之后也不適用! 即在MyApp中,調用x1.something()實際上並不調用XImpl1的方法,而是調用X類的something()方法。
我可能在這里犯了一些錯誤,如果有人可以指出一些建議,我將感到非常高興。 但是否則,似乎Spring仍然有一些局限性嗎?
我不了解Spring的限制。 我建議簡化。 不要再假設問題出在Spring:就是你。
我會說您的設計不必要地復雜。
我不知道這是一個例子還是您的真實代碼。 您對泛型的命名和使用使它無法閱讀和理解。 您已經從類層次結構中抽象出了所有理解。
這聽起來像是應該優先於繼承而不是繼承的情況。 那只是我的意見。
@Autowire
構造函數時,我建議將@Qualifier
添加到參數列表中,並使用值精確說明要注入的bean。 如果您有幾個由bean工廠管理的相同類型的bean,期望Spring會讀懂您的想法是不合理的。 它無法選擇自動接線。 只有您可以決定。
世界正朝着功能編程的方向發展,而不是面向對象。 我很想知道您是否可以通過使用lambdas和新的java.util.function包來對此進行改進。 您可能會獲得更大的靈活性和更好的理解。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.