我有一个使用Spring IoC的多模块Maven项目,比如
parent-proj
- module1
- module2
- module3
- web-module
我的问题是:
汇编applicationContext文件的最佳做法是什么?我应该在Web模块中创建一个巨大的applicationContext-web.xml吗?或者我应该在每个子模块中创建applicationContext-module<#> .xml,并在我的applicationContext-web.xml中导入所有这些?
我一直在使用第二个选项。现在它看起来有点失控(例如bean覆盖具有相同id的bean等)。
感谢。
答案 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。