Spring上下文文件组织和最佳实践

时间:2009-01-10 15:23:32

标签: java spring java-ee

我们已经开始在我的项目中使用Spring框架。在熟悉了基本功能(IoC)之后,我们也开始使用弹簧和弹簧安全性。

问题是我们现在有超过8个不同的上下文文件,我觉得我们没有充分考虑这些文件及其角色的组织。随着项目的发展,引入了新文件。 我们有不同的上下文文件:元数据,aop,授权,服务,Web资源(它是一个RESTful应用程序)。因此,当开发人员想要添加新bean时,并不总是清楚他应该添加哪个文件。我们需要方法论。

问题:

Spring文件组织是否有最佳实践?

上下文文件是否应封装层(DAL,业务逻辑,Web)或用例?还是流量?

7 个答案:

答案 0 :(得分:19)

如果您仍然在项目的早期阶段,我建议您强烈关注注释驱动的配置。转换为注释后,我们只有1个带定义的xml文件,它实际上非常小,这是一个大型项目。注释驱动配置将重点放在您的实现而不是xml上。它或多或少地删除了相当多余的抽象层,即春天的“bean名称”。事实证明,bean名称主要存在于中,因为xml的(bean名称仍然存在于注释配置中,但在大多数情况下无关紧要)。在对一个大型项目进行此项切换之后,每个人都100%同意这是一个更好的批次,我们也有相当不错的证据表明这是一个更高效的环境。

我真的推荐使用spring切换到注释的任何人。它们也可以混合使用。如果您需要过渡性建议,我认为很容易在SO上询问;)

答案 1 :(得分:7)

从applicationContext.xml开始,当有很多bean有共同点时分开。

为了让您了解可能的设置,在我正在处理的应用程序中,这是我在服务器中的内容:

  • 的applicationContext.xml
  • securityContext.xml
  • schedulingContext.xml
  • dataSourcecontext.xml
  • spring-ws-servlet.xml(与Spring Web Services相关的bean)

对于GUI客户端,由于此项目有多个,因此有一个文件夹包含共享上下文文件,最重要的是,每个客户端都有自己的上下文文件夹。共享上下文文件:

  • sharedMainApplicationContext.xml
  • sharedGuiContext.xml
  • sharedSecurityContext.xml

特定于应用的文件:

  • mainApplicationContext.xml和
  • guiContext.xml和
  • commandsContext.xml(菜单结构)
  • sharedBusinessLayerContext.xml(用于连接服务器的bean)

答案 2 :(得分:5)

Spring上下文文件包含bean的定义,所以我认为最好遵循OO原则并按照在包中构造类的方式构造它们。我们通常创建包来封装一组一起工作以解决特定问题的类。包通常封装水平层(数据库层,中间件,业务逻辑或其中的一部分)。有时候包中包含的对应于水平层的类(如前所述的用例或流)。一般来说,我建议为每个包或一组包创建一个上下文文件。添加新bean时,将其添加到与类的包对应的上下文文件中。

当然,这不应该是一个非常严格的规则,因为可能会有一些情况会对其他做法有所帮助。

答案 3 :(得分:1)

我发现我逐层打破它们。

当我为每个图层编写单元测试时,我会使用与测试相关的值覆盖生产上下文。

答案 4 :(得分:1)

是的 - 拆分其中豆类的相似角色。至于注释,我相信他们“可能”扮演一个小角色,可能有交易定义,但除此之外他们只是永远绑定你的代码,你也可以直接在任何地方添加spring(或任何其他第三方)引用。对我来说,注释=捷径和技术债务。它们不是外部可配置的,因此重新连接或取消链接代码并限制重用并非易事。给定的bean永远停留在其带注释的依赖项和配置中,因此多个项目/进程可以同时使用不同的布线和配置。 我的2美分。

答案 5 :(得分:1)

我会按照春天的推荐,将上下文文件放在META-INF/spring中,如Spring Roo documentation中所述。一般来说,我建议尝试roo并遵循他们的项目结构和布局。

示例

src/
+-- main/
|   +-- java/
|   \-- resources/
|       +-- META-INF/
|       |   \-- spring/                    ‹ normal spring context files
|       |       +-- context.xml
|       |       \-- context-services.xml
|       \-- other files
|
+-- test/
|   +-- java/
|   \-- resources/
|       +-- META-INF/
|       |   \-- spring/                    ‹ context files for testing
|       |       +-- context-test.xml
|       |       \-- context-dao-test.xml   
|       \-- other files
|
\-- pom.xml

Spring XML vs annotations

关于这个主题有很多好文章,但我想打破一个常见的误解,因为这两种方法都有其优点:如果你想将配置与实际实现分开,那么使用XML会更容易,但是你可以用注释实现相同的东西,如krosenvold said。但是,在使用XML配置文件时,如果必须直接引用bean,则只需要bean名称。您始终可以按名称或类型使用auto-wiring

唯一重要的是,您应该在整个项目中保持一致,或者尽可能在整个公司的项目中保持一致。

答案 6 :(得分:0)

在测试方面,将配置分成单独的文件对我很有用。在一个小项目中,我将Spring Security配置放入“securityContext.xml”,将其余的bean放入“applicationContext.xml”。然后在运行集成测试时,通过选择是否包含securityContext.xml,可以轻松启用或禁用安全性。这在某种程度上类似于AOP,因为您可以通过选择是否包含特定文件来为应用程序添加更多功能。