Bean 列表中未保留顺序 - Spring 启动
Order not preserved in a Bean list - Spring Boot
我有一个这样创建的 bean:
@Configuration
public class TestConfiguration {
@Bean
List<TestItem> testItemsList(TestItem item1, TestItem item2, TestItem item3) {
return List.of(item1, item2, item3);
}
}
我在其他服务中自动装配了这个列表。
@Service
public class ItemsServiceImpl implements ItemsService {
private final List<TestItem> testItems;
....
@Override
public Result useItems() {
testItems.forEach(item -> {
log.info("component: "+item.toString());
});
}
问题是,当我尝试在简单的 forEach
循环中使用它时,顺序不同,我得到 item3, item1, item2
记录。
我也玩了一下,添加了一个构造函数:
public ItemsServiceImpl(List<TestItem> testItems) {
this.testItems = testItems;
log.info("constructor order" + Arrays.toString(testItems.toArray()));
}
它还会以错误的顺序打印值:testItem3, testItem1, testItem2
.
这可能是什么问题?
您没有使用 testItemsList
bean 方法创建的列表。您得到的是 Spring 所有 TestItem
实现的列表。 Spring 参考指南的 this section 对此进行了解释。
事实上,即使您删除 testItemsList
方法,您的代码仍将以相同的方式工作。
你有两种方法可以解决这个问题。
- 在
@Autowired
注释旁边(或在构造函数上)添加一个 @Qualifier("testItemsList")
。
- 删除
testItemsList
并将 @Order
放置在您的 TestItem
实施中,按照您希望的顺序放置。
我有一个这样创建的 bean:
@Configuration
public class TestConfiguration {
@Bean
List<TestItem> testItemsList(TestItem item1, TestItem item2, TestItem item3) {
return List.of(item1, item2, item3);
}
}
我在其他服务中自动装配了这个列表。
@Service
public class ItemsServiceImpl implements ItemsService {
private final List<TestItem> testItems;
....
@Override
public Result useItems() {
testItems.forEach(item -> {
log.info("component: "+item.toString());
});
}
问题是,当我尝试在简单的 forEach
循环中使用它时,顺序不同,我得到 item3, item1, item2
记录。
我也玩了一下,添加了一个构造函数:
public ItemsServiceImpl(List<TestItem> testItems) {
this.testItems = testItems;
log.info("constructor order" + Arrays.toString(testItems.toArray()));
}
它还会以错误的顺序打印值:testItem3, testItem1, testItem2
.
这可能是什么问题?
您没有使用 testItemsList
bean 方法创建的列表。您得到的是 Spring 所有 TestItem
实现的列表。 Spring 参考指南的 this section 对此进行了解释。
事实上,即使您删除 testItemsList
方法,您的代码仍将以相同的方式工作。
你有两种方法可以解决这个问题。
- 在
@Autowired
注释旁边(或在构造函数上)添加一个@Qualifier("testItemsList")
。 - 删除
testItemsList
并将@Order
放置在您的TestItem
实施中,按照您希望的顺序放置。