如何在Spring Java Config中将多个对象注册为bean?

时间:2016-09-15 12:10:15

标签: spring 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

2 个答案:

答案 0 :(得分:1)

您应该使用参数

指定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在每次A执行时创建一个新的template,并将实例注册到上下文中。

执行main的结果与您期望的一样

Y
Z
MyConfig$A@15bfd87
[MyConfig$A@543e710e, MyConfig$A@57f23557]
X

答案 1 :(得分:0)

我想要的是不可能的,但需要https://jira.spring.io/browse/SPR-13348

如果您认为多个bean注册正常,请upvote