我有一个依赖于B.jar和C.jar的项目A.它们都在类路径中有一个名为spring-datasource.xml
的资源文件。当项目A导入spring-datasouce.xml
时,将选择哪一个? A如何做出决定?
答案 0 :(得分:0)
如果这两个文件包含不同的bean定义,那么它将简单地在这两个文件中创建所有bean定义。文件具有相同名称的事实无关紧要。
如果两个文件定义具有相同名称的bean,则Spring将使用后面的定义覆盖先前的定义。例如:如果B.jar::spring-datasource.xml
和C.jar::spring-datasource.xml
都包含名为dataSource
的bean,那么......
B.jar::spring-datasource.xml
,它将根据该文件中的定义创建dataSource
bean,然后当遇到C.jar::spring-datasource.xml
时,它将覆盖dataSource
bean C.jar::spring-datasource.xml
bean.3 C.jar::spring-datasource.xml
,那么反过来就会发生。这个术语:“遇到第一个”指的是Spring发现XML配置文件的方式,即文件在加载到Spring上下文中时的排序。通常,这将由运行时类路径中的B.jar
和C.jar
的顺序控制。
如果您担心这一点,即如果您需要确定宣布豆类的顺序,那么:
B.jar
和C.jar
的顺序以首选顺序将这些XML文件传递到Spring上下文这不是真的推荐;它很脆弱且容易出错。
使用带有@Primary
注释的Java配置或使用Spring配置文件来控制加载Spring配置的FWIW都可以更好地控制这种情况。