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

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

Spring Java Config:如何使用運行時參數(shù)創(chuàng)建原型范圍的@Bean?

Spring Java Config:如何使用運行時參數(shù)創(chuàng)建原型范圍的@Bean?

白衣非少年 2019-12-10 10:22:14
使用Spring的Java Config,我需要使用只能在運行時獲得的構(gòu)造函數(shù)參數(shù)來獲取/實例化作用域原型的bean??紤]以下代碼示例(為簡便起見,對其進(jìn)行了簡化):@Autowiredprivate ApplicationContext appCtx;public void onRequest(Request request) {    //request is already validated    String name = request.getParameter("name");    Thing thing = appCtx.getBean(Thing.class, name);    //System.out.println(thing.getName()); //prints name}Thing類的定義如下:public class Thing {    private final String name;    @Autowired    private SomeComponent someComponent;    @Autowired    private AnotherComponent anotherComponent;    public Thing(String name) {        this.name = name;    }    public String getName() {        return this.name;    }}注意事項name是final:它只能通過構(gòu)造函數(shù)來提供,并保證不變性。其他依賴關(guān)系是Thing類的特定于實現(xiàn)的依賴關(guān)系,不應(yīng)知道(緊密耦合到)請求處理程序?qū)崿F(xiàn)。這段代碼與Spring XML配置完美配合,例如:<bean id="thing", class="com.whatever.Thing" scope="prototype">    <!-- other post-instantiation properties omitted --></bean>如何使用Java配置實現(xiàn)同一目的?以下內(nèi)容在Spring 3.x中不起作用:@Bean@Scope("prototype")public Thing thing(String name) {    return new Thing(name);}現(xiàn)在,我可以創(chuàng)建一個工廠,例如:public interface ThingFactory {    public Thing createThing(String name);}但這打敗了使用Spring替換ServiceLocator和Factory設(shè)計模式的全部觀點,這對于該用例而言是理想的選擇。如果Spring Java Config可以做到這一點,我將能夠避免:定義工廠接口定義工廠實現(xiàn)為工廠實施編寫測試相對于瑣碎的事情,Spring已經(jīng)通過XML配置支持了很多工作(相對而言)。
查看完整描述

3 回答

?
哈士奇WWW

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

在@Configuration課堂上,@Bean像這樣的方法


@Bean

@Scope("prototype")

public Thing thing(String name) {

    return new Thing(name);

}

用于注冊bean定義并提供創(chuàng)建bean的工廠。它定義的Bean僅在請求時使用直接或通過掃描確定的參數(shù)實例化ApplicationContext。


對于prototypeBean,每次都會創(chuàng)建一個新對象,因此@Bean也會執(zhí)行相應(yīng)的方法。


您可以ApplicationContext通過的BeanFactory#getBean(String name, Object... args)方法檢索Bean,該方法指出


允許指定顯式構(gòu)造函數(shù)自變量/工廠方法自變量,覆蓋Bean定義中指定的默認(rèn)自變量(如果有)。


參數(shù):


如果使用靜態(tài)工廠方法的顯式參數(shù)創(chuàng)建原型,則使用args參數(shù)。在任何其他情況下,使用非null的args值都是無效的。


換句話說,對于此prototype作用域的bean,您將提供將要使用的參數(shù),而不是在bean類的構(gòu)造函數(shù)中,而是在@Bean方法調(diào)用中。


對于Spring 4+版本至少是這樣。


查看完整回答
反對 回復(fù) 2019-12-10
?
慕標(biāo)琳琳

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

使用Spring> 4.0和Java 8,您可以更安全地執(zhí)行此操作:


@Configuration    

public class ServiceConfig {


    @Bean

    public Function<String, Thing> thingFactory() {

        return name -> thing(name); // or this::thing

    } 


    @Bean

    @Scope(value = "prototype")

    public Thing thing(String name) {

       return new Thing(name);

    }


}

用法:


@Autowired

private Function<String, Thing> thingFactory;


public void onRequest(Request request) {

    //request is already validated

    String name = request.getParameter("name");

    Thing thing = thingFactory.apply(name);


    // ...

}

因此,現(xiàn)在您可以在運行時獲取bean。當(dāng)然,這是一種工廠模式,但是您可以節(jié)省一些時間來編寫特定的類,例如ThingFactory(但是您必須編寫custom @FunctionalInterface來傳遞兩個以上的參數(shù))。


查看完整回答
反對 回復(fù) 2019-12-10
  • 3 回答
  • 0 關(guān)注
  • 856 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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