我有一个非常简单的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的集合没有任何变化。
1条答案
按热度按时间dly7yett1#
你的启动应用程序是一个有趣的方式,但无论如何,这是一堆代码
当它调用时,其他两个dogs还没有初始化,所以在dogs列表中只有@component注解了一个,即“noname”