spring:如何在使用@Autowired和context:component-scan自动连接原型bean时使用非默认构造函数?

JBT*_*JBT 14 java spring

假设您有一个原型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种方法,只需查看最适合您的情况:

使用@Autowired构造函数

更好的时候:你拥有在上下文中构建原型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 次

最近记录:

8 年,3 月 前