【问题标题】:Autowiring Bean before initialization of another Bean在初始化另一个 Bean 之前自动装配 Bean
【发布时间】:2019-04-02 13:22:06
【问题描述】:

春季题。

我有两个关于 spring 的问题。

如果我这样声明 bean:

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

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

第二个问题。如何自动装配其他一些 bean,例如"bean2" 是 String "externalBean",可用于构造 bean1。

@Service
public class Downloader {

    @Autowire
    private String bean2;       

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

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

【问题讨论】:

标签: java spring spring-boot


【解决方案1】:

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

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

【讨论】:

  • 谢谢。这回答了我的问题。杰基! :)
  • @MarcinKapusta Scope 注释与您的问题没有任何关系。你不需要它。
  • 它隐含地解释了@Bean 的行为
【解决方案2】:

如果其他类将自动装配“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 的 name 并将其与参数的名称进行比较。

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

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

顺序由 Sp​​ring 自动计算,基于 Bean 依赖关系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    相关资源
    最近更新 更多