簡體   English   中英

Spring 4對抽象泛型類的依賴注入不起作用

[英]Spring 4 dependency injection for abstract generic classes do not work

我有XY基類,它們具有多個實現。 但是,每種參數化類型只有一個實現,因此@Autowired應該能夠確定需要哪個子類。

在將第二個參數U添加到基類XY (並因此添加到它們的所有子類)之前,這實際上是可行的。 但是添加之后,這是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與參數化類型AB (即唯一的子類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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM