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

时间:2012-10-16 18:52:39

标签: web-services spring maven inversion-of-control

我有一个使用Spring IoC的多模块Maven项目,比如

parent-proj
  - module1
  - module2
  - module3
  - web-module

我的问题是:

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

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

感谢。

2 个答案:

答案 0 :(得分:10)

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

其次,不应该按项目模块拆分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

希望有意义。

答案 1 :(得分:5)

我更喜欢第二种方法,但使用Spring classpath*:伪URL。类似的东西:

<import resource="classpath*:META-INF/module-context.xml" />

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

  

现在看起来事情有点失控(例如,豆子覆盖   具有相同id的bean等。)

这只是组织项目的问题。我总是尝试使用@Autowired,因此Spring可以根据我声明的接口解析依赖关系。当然,我从不扫描模块外的软件包来逃避Id的这类问题。

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

基本思想(不是针对弹簧而是针对模块化项目)已得到很好的解释here