Spring bean 名称和别名

Spring bean names and aliases

假设在外部配置中,一个 bean 连接了名称 "externalBean"。

例如

   @Bean("externalBean")
        public Foo foo() {
            Foo foo = new Foo();
            return foo;
        }

如果我在自己的配置中执行以下操作:

 @Bean("myBean")
    public Foo foo(@Qualifier("externalBean") Foo foo) {
       return foo;
    }

我现在可以使用 @Qualifier("myBean") 在我的代码中自动装配 bean。

说 myBean 现在是 externalBean 的别名是否正确?

现在只有一个 Foo bean 实例吗?

有什么意见吗?

说 myBean 现在是 externalBean 的别名是否正确?

No, alias for myBean is myBean and for externalBean is externalBean

现在只有一个 Foo bean 实例吗?

No, you will have two instances - externalBean and myBean

备注:

如果您只需要 Foo 的一个 bean,您可以直接使用 foo 方法之一创建它,或者您可以使用单独的方法为您完成它而无需 @Bean 注释. 如果你想有两个不同名称的 bean,你不必坚持使用别名,你可以将方法重命名为预期的 bean 名称(例如 myBeanexternalBean 等)。虽然 @Autowire 您可以根据方法(bean)名称指定所需的 bean。

假设它实际上是一个别名,因为只有一个 Foo 实例,尽管仍然有两个 bean。这些都只是 return 对 Foo 对象的相同引用。

举个例子

@SpringBootApplication
public class BeanApp{

    public static void main(String[] args) {
        SpringApplication.run(BeanApp.class, args);
    }

    static class Foo {
        String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

    @Bean("externalBean")
    public Foo foo(){
        return new Foo();
    }

    @Bean("myBean")
    public Foo foo1(@Qualifier("externalBean") Foo foo){
        return foo;
    }

    @Bean
    public String ready(@Qualifier("externalBean") Foo foo, @Qualifier("myBean") Foo foo1){
        foo.setName("This is a bean");
        System.out.println(foo.getName());
        System.out.println(foo1.getName());
        return "Ready";
    }


}

这将打印 "This is a bean" 两次,即使从两个单独的 bean 调用了 getName。