3 回答

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+版本至少是這樣。

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ù))。
添加回答
舉報