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 方法,您的代码仍将以相同的方式工作。

你有两种方法可以解决这个问题。

  1. @Autowired 注释旁边(或在构造函数上)添加一个 @Qualifier("testItemsList")
  2. 删除 testItemsList 并将 @Order 放置在您的 TestItem 实施中,按照您希望的顺序放置。