您应该如何为多模块Spring Maven项目组织applicationContext文件?

sca*_*age 9 spring web-services inversion-of-control maven

我有一个使用Spring IoC的多模块Maven项目,类似于

parent-proj
  - module1
  - module2
  - module3
  - web-module
Run Code Online (Sandbox Code Playgroud)

我的问题是:

组装applicationContext文件的最佳实践是什么?我应该在Web模块中创建一个巨大的applicationContext-web.xml吗?或者我应该在每个子模块中创建applicationContext-module <#>.xml,并在我的applicationContext-web.xml中导入所有这些模块?

我一直在使用第二个选项.现在它看起来有点失控(例如bean覆盖具有相同id的bean等).

谢谢.

yor*_*rkw 10

首先,如果module1,module2和module3是纯粹的java库(例如,包含Domain Model,DAO,Service类等),它们在web模块中被引用和使用,我们通常不会在这个纯粹的java库中操作Spring容器.

其次,您不应该按项目模块拆分Spring容器.根据需求,您可以按应用程序层溢出Spring容器,并在Web模块项目中定义多个applicationContext文件(以避免单个巨大的applicationContext.xml).例如,这就是我们通常做的事情:

web-module/src/main/webapp/WEB-INF:
  applicationContext-dataAccess.xml
  applicationContext-dataStore.xml
  applicationContext-security.xml
  applicationContext-web.xml
  ... ...
  web.xml
Run Code Online (Sandbox Code Playgroud)

希望有意义.


Eld*_*ael 5

我也喜欢第二种方法,但使用Spring classpath*:伪URL.就像是:

<import resource="classpath*:META-INF/module-context.xml" />
Run Code Online (Sandbox Code Playgroud)

这将在我的模块META-INF文件夹中加载任何模块xml bean定义.

现在它看起来有点失控(例如bean覆盖具有相同id的bean等).

这只是组织项目的问题.我总是试图使用,@Autowired所以Spring可以根据我声明的接口解决依赖关系.当然,我从不扫描模块外的包以逃避Id的这类问题.

如果无法进行自动装配,则只通过xml声明bean并将其放在那里.

这里很好地解释基本思想(不是弹簧而是模块化项目).