在初始化另一个Bean之前自动装配Bean

时间:2019-04-02 13:22:07

标签: java spring spring-boot

春季问题。

我有两个与春天有关的问题。

如果我这样声明bean:

@Service
public class Downloader {
    @Bean
    public String bean1() {
        return "bean1";
    }
}

然后,如果其他类将自动装配“ bean1”,那么方法bean1将被调用几次?还是将创建并重用一个bean1实例?

第二个问题。如何自动连接其他bean,例如“ bean2”,它是可用于构造bean1的字符串“ externalBean”。

@Service
public class Downloader {

    @Autowire
    private String bean2;       

    @Bean
    public String bean1() {
        return "bean1" + this.bean2;
    }
}

当前,我正在尝试自动装配bean2,但是在bean1调用期间它为null。有什么机制可以指定此顺序。我不知道在什么情况下Spring文档中会寻找这种信息。

2 个答案:

答案 0 :(得分:1)

仅使用简单的@Bean注释即可将范围设置为标准单例,因此将仅创建一个。根据文档,如果要更改,则需要显式添加另一个注释:

  

@Scope将Bean的范围从单例更改为指定范围

答案 1 :(得分:1)

  

然后,如果其他类将自动装配“ bean1”,则使用方法bean1   会被叫几次?否则将创建一个bean1实例   并重复使用?

只有bean1的一个实例,因为隐式范围是 Singleton (不存在@Scope注释)。

  

第二个问题。如何自动连接其他bean,例如“ bean2”是   可用于构造bean1的字符串“ externalBean”。

由于它是String,因此需要@Qualifier 可能

@Bean
@Qualifier("bean2")
public String bean2() {
    return "bean2";
}

然后

@Bean
public String bean1(@Qualifier("bean2") final String bean2) {
    return "bean1" + bean2;
}

但是,这也可行。
Spring将能够查看Bean的名称并将其与参数的Bean进行比较。

@Bean
public String bean2() {
    return "bean2";
}

@Bean
public String bean1(final String bean2) {
    return "bean1" + bean2;
}

订单是由Spring根据Bean依赖关系自动计算的。