Spring将如何处理两个具有相同名称的XML配置文件?

时间:2017-10-22 12:33:30

标签: java spring

我有一个依赖于B.jar和C.jar的项目A.它们都在类路径中有一个名为spring-datasource.xml的资源文件。当项目A导入spring-datasouce.xml时,将选择哪一个? A如何做出决定?

1 个答案:

答案 0 :(得分:0)

如果这两个文件包含不同的bean定义,那么它将简单地在这两个文件中创建所有bean定义。文件具有相同名称的事实无关紧要。

如果两个文件定义具有相同名称的bean,则Spring将使用后面的定义覆盖先前的定义。例如:如果B.jar::spring-datasource.xmlC.jar::spring-datasource.xml都包含名为dataSource的bean,那么......

  • 如果Spring首先遇到B.jar::spring-datasource.xml,它将根据该文件中的定义创建dataSource bean,然后当遇到C.jar::spring-datasource.xml时,它将覆盖dataSource bean C.jar::spring-datasource.xml bean.3
  • 中的定义
  • 如果Spring首先遇到C.jar::spring-datasource.xml,那么反过来就会发生。

这个术语:“遇到第一个”指的是Spring发现XML配置文件的方式,即文件在加载到Spring上下文中时的排序。通常,这将由运行时类路径中的B.jarC.jar的顺序控制。

如果您担心这一点,即如果您需要确定宣布豆类的顺序,那么:

  • 没有多个相同 bean名称
  • 的定义
  • 确保类路径中B.jarC.jar的顺序以首选顺序将这些XML文件传递到Spring上下文

这不是真的推荐;它很脆弱且容易出错。

使用带有@Primary注释的Java配置或使用Spring配置文件来控制加载Spring配置的FWIW都可以更好地控制这种情况。