@component bean重写@bean one以进行集合自动连接

nnsrf1az  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(309)

我有一个非常简单的spring启动测试应用程序。
它只有一个dog类和@springbootapplication注解的类。我创建了两个豆子的狗和一切运行的预期。

public class Dog {

    public String name;

    public Dog() {
        this("noname");
    }

    public Dog(String name) {
        this.name = name;
    }

    public String toString() {
        return name;
    }
}
@SpringBootApplication
public class DemoApplication {

    @Autowired
    private List<Dog> dogs;

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

    @Bean
    CommandLineRunner runner1() {
        return args -> {
            for (Dog d : dogs) {
                System.out.println(d);
            }
        };
    }

    @Bean
    Dog laika() {
        return new Dog("laika");
    }

    @Bean
    Dog lassie() {
        return new Dog("lassie");
    }
}

输出:

laika
lassie

不过,现在我向dog类添加了一个@component注解,希望现在我有三个dog类型的bean,如果我用另一个commandlinerunner打印所有bean,就像这样:

@Bean
      public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
        return args -> {
          System.out.println("Let's inspect the beans provided by Spring Boot:");
          String[] beanNames = ctx.getBeanDefinitionNames();
          Arrays.sort(beanNames);
          for (String beanName : beanNames) {
            System.out.println(beanName);
          }
        };
    }

输出:

Let's inspect the beans provided by Spring Boot:
applicationAvailability
applicationTaskExecutor
commandLineRunner
demoApplication
dog
laika
lassie
lifecycleProcessor
...

然而,当我使用我的第一个commandlinerunner打印出我的狗列表的内容时,我得到的唯一输出是:

noname

似乎@component bean已经使@bean声明的bean消失,以便进行集合注入。我对任何bean都观察到了相同的行为,例如,如果我在一个独立的@component类中声明了更多的commandlinerunners,那么每个bean都会运行,但是当我@autowire将它们放在一个列表中时,只会注入那些用@component声明的bean。
尽管如此,我仍然可以使用其他狗豆。例如,如果我用@primary注解laika bean,它将作为方法参数被注入,但是@autowire的集合没有任何变化。

dly7yett

dly7yett1#

你的启动应用程序是一个有趣的方式,但无论如何,这是一堆代码

@Bean
CommandLineRunner runner1() {
    return args -> {
        for (Dog d : dogs) {
            System.out.println(d);
        }
    };
}

当它调用时,其他两个dogs还没有初始化,所以在dogs列表中只有@component注解了一个,即“noname”

相关问题