假设您有一个原型bean类,如下所示:
@Component
@Scope("prototype")
public class Foobar {
private String foo;
public Foobar( String foo ) {
this.foo = foo;
}
}
Run Code Online (Sandbox Code Playgroud)
那么,是否可以使用@Autowired在另一个类中连接这样的bean,它应该使用非默认构造函数Foobar(String foo)来实例化bean?
update
在上面的示例中,构造函数参数String foo不可从应用程序上下文中获得,而是动态的.因此,对构造函数进行注释,@Autowired然后foo在上下文中指定某处,这似乎不是一个理想的解决方案.
Fra*_*eth 19
以下是3种方法,只需查看最适合您的情况:
更好的时候:你拥有在上下文中构建原型bean所需的一切(即使对于诸如此类的属性@Value("${prop}"))
如果你想要一种自动方式,你需要拥有在上下文中实例化bean所需的一切(即使对于原型bean).如果您在上下文中拥有所需的一切,您可以简单地将构造函数注释为,@Autowired而Spring将为您完成其余的工作.
@Component
@Scope("prototype")
public class FooBar {
private Baz baz;
@Autowired
public FooBar(Baz baz) {
this.baz = baz;
}
}
Run Code Online (Sandbox Code Playgroud)
FactoryBeans更好的时候:如果你使用基于XML的上下文,你会更喜欢这种方式.
如果你需要一种个性化的方式,另一种可能性就是使用FactoryBeans.来自文档:
由BeanFactory中使用的对象实现的接口,这些对象本身就是工厂.如果bean实现了这个接口,它将被用作公开的对象的工厂,而不是直接作为将自己公开的bean实例.
该FactoryBean所使用的春天刚刚建立你请求的对象(即其原型或单).
对于您的情况,您可以拥有如下实现:
@Component
public class FooBarFactory implements FactoryBean<FooBar> {
@Autowired
private Baz myContextProvidedObject;
@Override
public FooBar getObject() throws Exception {
return new FooBar(myContextProvidedObject, "my parameter");
}
@Override
public Class<?> getObjectType() {
return FooBar.class;
}
@Override
public boolean isSingleton() {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
你可以简单地@Autowired FooBar在你的上下文的其他实例上.
@Configuration更好的时候:如果您已经使用注释配置了上下文,那么您肯定会喜欢这种方式.
第三种方式,这是我的最爱,将使用你的@Configuration课程.来自文档:
public @interface Configuration:表示一个类声明了一个或多个@Bean方法,并且可以由Spring容器处理,以便在运行时为这些bean生成bean定义和服务请求,例如:
在该类中,您可以使用以下方法:
@Configuration
public class MyConfig {
@Bean
@Scope("prototype")
public FooBar fooBar(Baz myContextProvidedObject) {
return new FooBar(myContextProvidedObject, "my parameter");
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22661 次 |
| 最近记录: |