如何在 Spring Java 配置中将多个对象注册为 beans?
How to register many object as beans in Spring Java Config?
我想将多个对象动态注册为 Spring bean。如果没有 BeanFactoryPostProcessor
?
是可能的
@Configuration public class MyConfig {
@Bean A single() { return new A("X");}
@Bean List<A> many() { return Arrays.asList(new A("Y"), new A("Z"));}
private static class A {
private String name;
public A(String name) { this.name = name;}
@PostConstruct public void print() {
System.err.println(name);
}
}
}
实际输出显示只有一个 bean 在工作:
X
预计:
X Y Z
Spring 4.3.2.RELEASE
我想要的是不可能的,但用 https://jira.spring.io/browse/SPR-13348
请求
如果你觉得多bean注册还可以,请点赞
您应该使用参数
指定 A
bean 定义类型的原型
@Configuration
public class MyConfig {
@Bean @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
A template(String seed) {
return new A(seed);
}
@Bean
String singleA() {
return "X";
}
@Bean
List<A> many() {
return asList(template("Y"), template("Z"));
}
private static class A {
}
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
A a = (A) context.getBean("template");
System.out.println(a);
List<A> l = (List<A>) context.getBean("many");
System.out.println(l);
}
}
prototype
范围允许 Spring 在每次 template
执行时创建一个新的 A
并将实例注册到上下文中。
main
执行结果如你所愿
Y
Z
MyConfig$A@15bfd87
[MyConfig$A@543e710e, MyConfig$A@57f23557]
X
我想将多个对象动态注册为 Spring bean。如果没有 BeanFactoryPostProcessor
?
@Configuration public class MyConfig {
@Bean A single() { return new A("X");}
@Bean List<A> many() { return Arrays.asList(new A("Y"), new A("Z"));}
private static class A {
private String name;
public A(String name) { this.name = name;}
@PostConstruct public void print() {
System.err.println(name);
}
}
}
实际输出显示只有一个 bean 在工作:
X
预计:
X Y Z
Spring 4.3.2.RELEASE
我想要的是不可能的,但用 https://jira.spring.io/browse/SPR-13348
请求如果你觉得多bean注册还可以,请点赞
您应该使用参数
指定A
bean 定义类型的原型
@Configuration
public class MyConfig {
@Bean @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
A template(String seed) {
return new A(seed);
}
@Bean
String singleA() {
return "X";
}
@Bean
List<A> many() {
return asList(template("Y"), template("Z"));
}
private static class A {
}
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
A a = (A) context.getBean("template");
System.out.println(a);
List<A> l = (List<A>) context.getBean("many");
System.out.println(l);
}
}
prototype
范围允许 Spring 在每次 template
执行时创建一个新的 A
并将实例注册到上下文中。
main
执行结果如你所愿
Y
Z
MyConfig$A@15bfd87
[MyConfig$A@543e710e, MyConfig$A@57f23557]
X