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 名称(例如 myBean
、externalBean
等)。虽然 @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。
假设在外部配置中,一个 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 isexternalBean
现在只有一个 Foo bean 实例吗?
No, you will have two instances -
externalBean
andmyBean
备注:
如果您只需要 Foo
的一个 bean,您可以直接使用 foo
方法之一创建它,或者您可以使用单独的方法为您完成它而无需 @Bean
注释.
如果你想有两个不同名称的 bean,你不必坚持使用别名,你可以将方法重命名为预期的 bean 名称(例如 myBean
、externalBean
等)。虽然 @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。