Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 春天开始吃豆子的顺序是什么?_Java_Spring_Initialization - Fatal编程技术网

Java 春天开始吃豆子的顺序是什么?

Java 春天开始吃豆子的顺序是什么?,java,spring,initialization,Java,Spring,Initialization,我在XML文件中定义了两个bean(类A和类B)。当我启动它们时,DefaultListableBeanFactory首先创建类A的实例,然后创建类B的实例。然后我将这些类复制到一个单独的包中,并进行一些小的修改。当我从新包启动类时,DefaultListableBeanFactory首先创建类B的实例,然后创建类A的实例。为什么Spring会更改初始化顺序?它似乎不是随机的(即,在旧包中始终首先启动A类,在新包中始终首先启动B类)。我可以(也可能应该)在类B的定义中添加一个“depends-o

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

Spring将使用
ClassPathBeanDefinitionScanner
查找所有bean并在
BeanDefinitionRegistry
中注册它们。在内部,它将使用一个
路径匹配源模式解析器
。bean将按照它们被发现的顺序添加,稍后,spring将迭代它们并按此顺序加载它们,以解决所需的依赖项(请参见
DefaultListableBeanFactory.preInstanceSingleton

Spring机制背后的思想是对您隐藏所有这些内容,并在您的定义正确后保证在您的应用程序上下文中有一个构造良好的对象图(Spring可以实例化您的bean,Spring可以解析其依赖项…)

DefaultListableBeanFactory

/** List of bean definition names, in registration order */
private final List<String> beanDefinitionNames = new ArrayList<String>(64);
/**bean定义名称列表,按注册顺序排列*/
私有最终列表beanDefinitionNames=new ArrayList(64);

bean初始化的顺序应该无关紧要,因为字段是在创建bean之后注入的。顺序唯一重要的问题是其他类的构造函数参数何时需要bean,但是Spring注意到了这一点并将解决它。正如您所说,您不应该依赖它。如果两个bean真正相互依赖,Spring将确保在dependee之后初始化依赖项。除此之外,这是任何人的猜测。可能完全限定的类名被放在一个哈希映射中,这是它们返回的顺序。实际上,类B依赖于类a的一个副作用,但由于它总是在旧包中工作,并且总是在新包中的其他开发人员计算机上工作,没有人注意到这种依赖性。