我有基類X
和Y
,其中有多個實現。但是,只有一個實現爲每個參數化類型,因此@Autowired
應該能夠找出需要其子類。彈簧4依賴注入抽象泛型類不工作
在將第二個參數U
添加到基類X
和Y
(從而添加到它們的所有子類)之前,這實際上起作用。但補充說,這裏是春天初始化過程中的錯誤後:
org.springframework.beans.factory.UnsatisfiedDependencyException: 錯誤創建名爲「對myApp」豆:不滿意依賴 通過實地「X1」表示;嵌套的例外是 org.springframework.beans.factory.UnsatisfiedDependencyException: 錯誤創建名爲「xImpl1」豆:不滿意依賴 通過現場表示「Y」;嵌套異常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:否 類型'test.Y>' 可用的符合條件的bean:預計至少有1個bean符合自動連接 候選。依賴註釋: {@ org.springframework.beans.factory.annotation.Autowired(必需=真)}
的代碼在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仍然有一些限制?