第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Spring-自動裝配通用接口的通用實現(xiàn)

Spring-自動裝配通用接口的通用實現(xiàn)

紫衣仙女 2021-04-03 14:15:37
我有一個小問題。它可能微不足道,但我以前從未遇到過。我有通用接口及其通用實現(xiàn)。我想為其自動接線,但是發(fā)生了錯誤。詳細(xì)信息如下:界面@Servicepublic interface Serializing<T extends Serializable> {    String serialize(T toBeSerialized);    T deserialize(String toBeDeserialized, Class<T> resultType);}執(zhí)行@Servicepublic class JsonSerializer<T extends Serializable> implements Serializing<T> {   /** code **/}自動接線嘗試private NoteDAO noteDAO;@Qualifier("jsonSerializer")private Serializing<UserComment> serializer;@Autowiredpublic NoteController(NoteDAO noteDAO, Serializing<UserComment> serializer) {    this.noteDAO = noteDAO;    this.serializer = serializer;}錯誤Parameter 1 of constructor in somepackagepath.NoteController required a bean of type 'anotherpackagepath.Serializing' that could not be found.我想讓它盡可能簡單。我已經(jīng)檢查過Web,但是只發(fā)現(xiàn)了有關(guān)在配置中定義確切的bean的信息。如果可能的話,我寧愿避免使用它。
查看完整描述

3 回答

?
慕雪6442864

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;


    }

}


查看完整回答
反對 回復(fù) 2021-04-21
?
天涯盡頭無女友

TA貢獻(xiàn)1831條經(jīng)驗 獲得超9個贊

您必須告訴Spring您要它自動連線的所有bean。沒有例外。

如果您無法事先將其拼寫清楚,那么我想說它不是注射的候選人。

您需要完全控制和通話的某些內(nèi)容new。也許您的情況就是其中之一。這沒什么不對的。這僅表示Spring DI不適合該用例。


查看完整回答
反對 回復(fù) 2021-04-21
  • 3 回答
  • 0 關(guān)注
  • 173 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號