2011-06-08 121 views
16

我一直在讀Spring,它一直在討論你需要的彈簧配置數據,但是你把這個xml文件放在哪裏?你將它保存爲什麼?我似乎無法在任何地方找到這些信息。Spring配置

+0

你是否在像Tomcat這樣的東西里面使用Spring,或者你在創建一個獨立的應用程序?你的應用程序如何啓動? – Darien 2011-06-08 19:00:03

+0

這些教程在學習spring時很有用http://krams915.blogspot.com/p/tutorials.html – NimChimpsky 2011-07-28 08:51:24

回答

0

這取決於你的應用程序是什麼,一些應用程序支持Spring的配置,在這種情況下,你需要檢查框架文檔。

如果它是一個獨立的應用程序,那麼你可以把文件的任何地方,但通常它被放置在

src/main/resources 

resources子目錄。

Spring的第3.2.2節docs顯示瞭如何實例化ApplicationContext

+0

'src/main/resources'僅適用於maven構建的項目 – aseychell 2011-06-08 19:54:29

+2

@aseychell是的,哇,我的maven根深蒂固方式:D – Tnem 2011-06-08 21:35:44

9

比這裏更重要的是,這個問題應該是給你的:這個'配置數據'究竟是什麼?

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進行開發,我鼓勵你閱讀整篇文章。

+0

+ +1參考Martin Fowler – bpgergo 2011-06-09 07:53:37

+1

我也發現很難找到有關spring web應用程序命名的配置文件的參考。參考文獻一直在討論「beans」文件的內容,但不是其名稱上的單詞。閱讀我發現它有一個CoC行爲:它首先查找一個名爲applicationContext.xml的文件。然後它查看web.xml上下文參數。搜索參考文獻時,從未提及「CoC」這個詞。我想就這個問題做出明確的迴應。 – AgostinoX 2011-07-28 08:50:44

+0

@AgostinoX:XML文件的名稱並不重要 - 內容是。 Spring允許您爲配置文件命名無論如何,您會發現方便 - 這就是配置文件的名稱在文檔中從未提及的原因。一般來說,我同意@abalogh首先你必須決定你想如何配置它,而不是在哪裏放置配置元數據。 'applicationContext.xml'只是一個簡單的配置文件的默認名稱,如果你沒有傳遞任何自定義的名字,但並不意味着你必須使用這個名字。 – Roadrunner 2011-07-28 12:55:28

0

正如其他人指出的那樣,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元素中指定幾個配置文件,用空格分隔它們。

2

那麼,如果有一個「官方」的名字,那麼我想它應該來自春天的傢伙自己。並且Spring設置合格的Spring項目的首選工具是Roo,看起來there我們發現SRC_MAIN_RESOURCES/META-INF/spring/applicationContext.xml(其中SRC_MAIN_RESOURCES是在Maven2項目中用於src/main/resources的placehiolder)。

+0

+1,告訴我在哪裏將'applicationContext.xml'文件放入使用Maven的獨立應用程序中! – 2012-05-18 13:52:07

8

比純名稱更有趣的是你如何分割文件(並給每個部分一個名字)。

如果您有獨立測試或Web應用測試,那麼您可以將所有配置放在一個文件中。 - 但沒有測試不應該是一個意見。

讓我們假設您有一個包含測試的Web應用程序。

然後,您應該將配置拆分爲兩個文件,一個用於純java(沒有web suff)配置,另一個包含用於WEB應用程序的所有其他內容。

我個人傾向於將其命名爲applicationContext.xml和webmvc-config.xml。 的Web配置文件的默認名稱(如果爲調度的Servlet沒有specifed)將/WEB-INF/<servletname>-servlet.xml

我找到的applicationContext.xml中classpath:/META-INF/spring目錄和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,並通過Dispatacher的webmvc-config.xml中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> 

現在你開始寫你的測試,爲您的應用程序的業務邏輯,而無需加載所有的網頁內容。但在大多數情況下,這不是明智之舉。例如,當您使用MySql等持久數據庫運行普通應用程序(,請不要責怪我對該句子),或者您希望在生產中使用jndi配置數據庫時,您想使用Inmemory數據庫運行一些快速測試和一個用於測試的「正常」配置。所以你需要的是兩種不同的配置。寫作時的每一件事情的兩倍,最簡單的方法是將兩個applicationContext.xml文件分割:

  • applicationContext.xml爲核心的東西,而分貝的東西,不同的測試
  • applicationContext-db.xml對生產數據庫配置(例如JNDI的查找的DB連接和LocalContainerEntityManagerFactoryBean用於MySQL的)

現在你明白的contextConfigLocation模式在web.xml

對於測試,您現在需要兩個文件(可以將它寫入一個文件,但我更喜歡兩個文件)。 * 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" /> 

因爲我用的春天,這兩個文件都位於/src/test/resources/META-INF/spring/testContext.xml

如果你有你的春天配置,其他方面,其中,測試和生產配置不同(例如調度),那麼你可以用同樣的方法分割它。

我希望你明白分裂,命名約定和位置是如何協同工作的。