spring 启动 bean 的顺序是什么?

Which order does spring start beans?

我在 XML 文件中定义了两个 bean(class A 和 class B)。当我启动它们时,DefaultListableBeanFactory 首先创建 class A 的实例,然后创建 class B 的实例。然后我将 classes 复制到一个单独的包中并进行一些小的修改。当我从新包启动 classes 时,DefaultListableBeanFactory 首先创建 class B 的实例,然后创建 class A 的实例。为什么 Spring 更改了初始化命令?它似乎不是随机的(即在旧包中总是先启动 class A,在新包中总是先启动 class B)。我可以(而且可能应该)在 class B 的定义中添加一个 "depends-on" 标记以确保一致的启动顺序,但我想知道为什么它在旧包中起作用。

Spring 将使用 ClassPathBeanDefinitionScanner 查找所有 bean 并将它们注册到 BeanDefinitionRegistry 中。在内部它将使用 PathMatchingResourcePatternResolver。 beans 将按照它们被发现的顺序添加,稍后,spring 将迭代它们并按此顺序加载它们以解决所需的依赖关系(参见 DefaultListableBeanFactory.preInstantiateSingletons)。

Spring 机制背后的想法是向您隐藏所有这些东西,并在您的定义正确时保证在您的应用程序上下文中构建良好的对象图(Spring 可以实例化您的 bean , Spring 可以解析其依赖关系...)

来自 DefaultListableBeanFactory :

/** List of bean definition names, in registration order */
private final List<String> beanDefinitionNames = new ArrayList<String>(64);