【问题标题】:Spring Configuration弹簧配置
【发布时间】:2011-09-11 03:17:18
【问题描述】:

我一直在阅读 Spring,它一直在谈论您需要的 Spring 配置数据,但是您将这个 xml 文件放在哪里?你把它保存成什么?我似乎在任何地方都找不到此信息。

【问题讨论】:

  • 您是在 Tomcat 之类的内部使用 Spring,还是在制作一个独立的应用程序?您的应用程序是如何启动的?
  • 这些教程在学习spring时很有用krams915.blogspot.com/p/tutorials.html

标签: xml spring


【解决方案1】:

比在哪里更重要的是,问题应该是给你的:这个“配置数据”到底是什么?

来自docs

Spring IoC 容器使用一种形式的配置元数据;此配置元数据表示您作为应用程序开发人员如何告诉 Spring 容器实例化、配置和组装应用程序中的对象。

传统上,配置元数据以简单直观的 XML 格式提供,本章大部分内容都使用这种格式来传达 Spring IoC 容器的关键概念和特性。

不过,您也可以使用 annotationsJava-based configuration 为您的 POJO 提供配置元数据。

在 Spring 中,构成应用程序主干并由 Spring IoC 容器管理的对象称为 bean。 bean 是由 Spring IoC 容器实例化、组装和管理的对象。否则,bean 只是应用程序中的众多对象之一。 Bean 以及它们之间的依赖关系反映在容器使用的配置元数据中。

正如 Tnem 已经提到的,here 您可以找到如何在不同场景中实例化容器。

这个 IoC 容器是什么?

IoC(控制反转)和 DI(依赖注入)是 Martin Fowler 创造的术语,关于 Spring,请参阅 first section of the docs

如果您想使用 Spring 进行开发,我鼓励您阅读整个参考资料。

【讨论】:

  • 我也发现很难找到关于 spring web 应用程序中配置文件命名的参考。该参考文献一直在谈论“beans”文件的内容,但没有提及其名称。环顾四周,我发现它具有 CoC 行为:它首先查找名为 applicationContext.xml 的文件。然后它查看 web.xml 上下文参数。搜索参考文献,从未提及“CoC”一词。我想对这个话题做出明确的回应。
  • @AgostinoX:XML 文件的名称并不重要——内容才是。 Spring 让您无论如何命名配置文件您觉得方便 - 这就是为什么文档中从未提及配置文件的名称的原因。一般来说,我同意@abalogh,首先你必须决定how 你想要配置它,然后where 来放置配置元数据。 applicationContext.xml 只是配置文件的简单默认名称,如果您不传递任何自定义名称,但这并不意味着您必须使用此名称。
  • @AgostinoX:如果您正在寻找命名和放置 spring 配置文件的最佳实践 - 好吧,我不知道是否有,如果有,恕我直言,这个问题不会问为了它。我最近发现对于 OSGi,类路径位置 META-INF/spring/*.xml 是默认位置。我喜欢它并开始在我的非 OSGi 应用程序中使用它。我还使用命名约定来使用表达式轻松地将我的配置文件分组(即META-INF/spring/*-context.xmlMETA-INF/spring/*-webcontext.xmlMETA-INF/spring/*-testcontext.xml)。
  • @Roadrunner:不幸的是,这里的问题完全是关于文件名的。我非常了解内容,因为我已经阅读了所有关于内容的参考书和其他书籍,但我也想明确一下名称。
  • @AgostinoX:配置文件的名称和位置完全取决于您。
【解决方案2】:

比纯名称更有趣的是如何拆分文件(并为每个部分命名)。

如果您有一个没有测试的独立或 Web 应用程序,那么您可以将所有配置放在一个文件中。 - 但是没有测试不应该是一种意见。

假设您有一个带有测试的 Web 应用程序。

然后您应该将配置拆分为两个文件,一个用于纯 java(没有 web suff)配置,另一个包含 WEB 应用程序的所有其他内容。

我个人更喜欢将其命名为 applicationContext.xml 和 webmvc-config.xml。 Web 配置文件的默认名称(如果没有为 Dispatcher Servlet 指定)将是 /WEB-INF/<servletname>-servlet.xml)

我在classpath:/META-INF/spring 目录中找到了applicationContext.xml,在WEB-INF/spring 中找到了webmvc-config.xml。那个位置就是Spring Roo的风格。它可以工作,但每个其他文件夹也可以工作。因为我使用maven,所以文件的确切位置是:

  • /src/main/resources/META-INF/spring/applicationContext.xml
  • /src/main/webapp/WEB-INF/spring/webmvc-config.xml

核心 applicationContext.xml 与 org.springframework.web.context.ContextLoaderListener 一起加载,而 webmvc-config.xml 由 Dispatacher Servlet 加载。 web.xml

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:META-INF/spring/applicationContext*.xml</param-value>
</context-param>

<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
    <servlet-name>CFMA-SpringProject</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/webmvc-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

现在您开始为应用程序的业务逻辑编写测试,而无需加载所有 Web 内容。但在大多数情况下,这还不够。例如,您想使用 Inmemory 数据库运行一些快速测试,同时使用像 MySql 这样的持久数据库运行普通应用程序(请不要因为那句话责备我),或者您想使用jndi 在生产中配置了数据库,并为测试配置了一个“正常”的数据库。所以你需要的是两种不同的配置。要不是每件事都写两次,最简单的方法是将applicationContext.xml 拆分为两个文件:

  • applicationContext.xml 用于没有与测试不同的数据库内容的核心内容
  • applicationContext-db.xml 用于生产数据库配置(例如用于数据库连接的 jndi-lookup 和用于 MySql 的 LocalContainerEntityManagerFactoryBean)

(现在你了解了web.xml中contextConfigLocation的模式)

对于测试,您现在需要两个文件(您可以将其写入一个文件,但我更喜欢两个)。 * testContext-h2DbConfig.xml applicationContext-db.xml 的测试同级文件,但带有测试数据库且不带 jndi。 * textContext.xml 这个文件在你的测试用例中由@ContextConfiguration 引用。此文件仅包含测试所需的配置的导入。在这种情况下是:

<import resource="classpath:/META-INF/spring/applicationContext.xml" /> 
<import resource="classpath:/META-INF/spring/testContext-h2DbConfig.xml" />

因为我用的是spring,所以两个文件都位于/src/test/resources/META-INF/spring/testContext.xml

如果您的 spring 配置有其他方面,测试和生产配置不同(例如调度程序),那么您可以以相同的方式拆分它。

我希望您了解拆分、命名约定和位置如何协同工作。

【讨论】:

    【解决方案3】:

    好吧,如果有一个“官方”名称,那么我想它应该来自 Spring 家伙自己。 Spring 设置符合 Spring 项目的首选工具是 Roo,查看 there 我们会找到 SRC_MAIN_RESOURCES/META-INF/spring/applicationContext.xmlSRC_MAIN_RESOURCES 是 Maven2 项目中 src/main/resources 的占位符)。

    【讨论】:

    • +1 告诉我将 applicationContext.xml 文件放在使用 Maven 的独立应用程序中的位置!
    【解决方案4】:

    这取决于你的应用程序是什么,有些应用程序支持Spring的配置,这种情况下你需要检查框架文档。

    如果它是一个独立的应用程序,那么你可以将文件放在任何地方,但通常是放在

    src/main/resources
    

    resources中的子目录。

    Spring docs 的第 3.2.2 节向您展示了如何实例化 ApplicationContext

    【讨论】:

    • src/main/resources 仅适用于 maven 构建项目
    • @aseychell 是的,哇,我在我的行家方式中如此根深蒂固:D
    【解决方案5】:

    正如其他人指出的那样,Spring 配置文件的名称并不是很重要。真正的问题是如何加载这个文件。 在独立应用程序中,您可以使用 ClassPathXmlApplicationContext 类之类的东西显式地执行此操作,如this part of the Spring documentation 中所述。

    在 Web 应用程序中,这通常在 web.xml 文件中进行配置,方法是添加配置侦听器的定义,可能还有配置文件。这是我使用的设置:

    <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:appContext.xml</param-value>
        </context-param>
    <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        <listener>
            <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
        </listener>
    

    这允许我将配置文件放在我喜欢的任何位置,只要它位于应用程序的类路径中。您甚至可以在 param-value 元素中指定多个配置文件,用空格分隔它们。

    【讨论】:

      猜你喜欢
      • 2019-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 2011-11-27
      • 1970-01-01
      相关资源
      最近更新 更多