我在XML文件中定义了两个bean(A类和B类)。当我启动它们时,DefaultListableBeanFactory首先创建类A的实例,然后创建类B的实例。然后我将类复制到一个单独的包中并进行一些小的修改。当我从新包中启动类时,DefaultListableBeanFactory首先创建类B的实例,然后创建类A的实例。为什么Spring更改了初始化顺序?它似乎不是随机的(即在旧包装中始终首先启动A类,在新包装中始终首先启动B类)。我可以(也可能应该)在B类的定义中添加一个“依赖”标签,以确保一致的启动顺序,但我想知道为什么它在旧包中有效。
答案 0 :(得分:0)
Spring将使用ClassPathBeanDefinitionScanner
查找所有bean并在BeanDefinitionRegistry
中注册它们。在内部,它将使用PathMatchingResourcePatternResolver
。 bean将按它们被发现的顺序添加,稍后,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);