3 回答
TA贡献1799条经验 获得超6个赞
在@Configuration课堂上,@Bean像这样的方法
@Bean
@Scope("prototype")
public Thing thing(String name) {
return new Thing(name);
}
用于注册bean定义并提供创建bean的工厂。它定义的Bean仅在请求时使用直接或通过扫描确定的参数实例化ApplicationContext。
对于prototypeBean,每次都会创建一个新对象,因此@Bean也会执行相应的方法。
您可以ApplicationContext通过的BeanFactory#getBean(String name, Object... args)方法检索Bean,该方法指出
允许指定显式构造函数自变量/工厂方法自变量,覆盖Bean定义中指定的默认自变量(如果有)。
参数:
如果使用静态工厂方法的显式参数创建原型,则使用args参数。在任何其他情况下,使用非null的args值都是无效的。
换句话说,对于此prototype作用域的bean,您将提供将要使用的参数,而不是在bean类的构造函数中,而是在@Bean方法调用中。
对于Spring 4+版本至少是这样。
TA贡献1830条经验 获得超9个赞
使用Spring> 4.0和Java 8,您可以更安全地执行此操作:
@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);
// ...
}
因此,现在您可以在运行时获取bean。当然,这是一种工厂模式,但是您可以节省一些时间来编写特定的类,例如ThingFactory(但是您必须编写custom @FunctionalInterface来传递两个以上的参数)。
添加回答
举报