1.原來在我開發(fā)的項(xiàng)目中由于是多人協(xié)作開發(fā),所以我會(huì)把Spring的配置文件按人分成多個(gè)。然后不論是單元測(cè)試還是通過web集成測(cè)試,都會(huì)把所有的文件裝載進(jìn)來。

單元測(cè)試的時(shí)候(或者其他不通過web裝載的情況),使用DefaultBeanFactory類和beanRefFactory.xml配置文件
有的時(shí)候單元測(cè)試相關(guān)的類很少的時(shí)候,我會(huì)單獨(dú)寫一個(gè)bean的配置文件,進(jìn)行單元測(cè)試。
web集成測(cè)試的時(shí)候直接在web.xml中配置
<context-param>
??<param-name>contextConfigLocation</param-name>
??<param-value>
???/WEB-INF/classes/WebApplicationContext.xml
???/WEB-INF/classes/HibernateContext.xml
???/WEB-INF/classes/WebApplicationContext_C.xml
.......
??</param-value>
?</context-param>

2.通過觀察jpetstore項(xiàng)目,它的配置文件是按照web/service/dao這樣的層次進(jìn)行劃分。
對(duì)于一些web services接口也會(huì)有專門的配置文件。
這樣的話結(jié)構(gòu)就會(huì)非常的清晰,所以在項(xiàng)目穩(wěn)定,進(jìn)入維護(hù)期的時(shí)候,可以把配置文件按照業(yè)務(wù)邏輯的層次進(jìn)行劃分。

3.為了能夠靈活配置,例如向一些數(shù)據(jù)庫連接的配置,因?yàn)榇蟛糠智闆r都是本地、測(cè)試服務(wù)器、正式服務(wù)器的配置是不同的,所以一般會(huì)通過寫一個(gè)jdbc.properties,在屬性文件中進(jìn)行配置。

4.在同時(shí)加在多個(gè)spring的配置文件的時(shí)候,也是有好多靈活的方法,這方面spring做的真強(qiáng)。上面說了兩種,還可以在applicationContext.xml文件中<beans>標(biāo)簽的后面,緊接著加入:
<import resource="dataAccessContext-local.xml"/>這樣的導(dǎo)入資源的語句。然后不同的環(huán)境可以使用不同的配置,不過這還需要每次都修改applicationContext.xml文件。該方法不如直接在web.xml中配置多個(gè)方便,但是也不是絕對(duì)。

5.最后還有一種更加方便的方法,可以不用修改applicationContext.xml文件,然后就能夠自動(dòng)裝載相關(guān)的配置文件。
首先,寫一個(gè)類:
package com.xiebing.spring.util;

import java.net.InetAddress;

import org.springframework.web.context.support.XmlWebApplicationContext;

/**
?* TODO file description *
?*
?* @author bing.xie
?*
?* @version 1.0, 2006-5-10? create
?*/
/**
?* @author bing.xie
?*?2006-5-10
?*/
public class PerHostXmlWebApplicationContext extends XmlWebApplicationContext {
?protected String[] getDefaultConfigLocations(){
??String hostname = "localhost";
??
??try{
???hostname = InetAddress.getLocalHost().getHostName();
??}catch(Exception e){
???
??}
??String perHostConfiguration = DEFAULT_CONFIG_LOCATION_PREFIX
??????+ "applicationContext-"
??????+ hostname
??????+ DEFAULT_CONFIG_LOCATION_SUFFIX;
??if(getNamespace() != null){
???return new String[]{
?????DEFAULT_CONFIG_LOCATION_PREFIX
?????+ this.getNamespace()
?????+ DEFAULT_CONFIG_LOCATION_SUFFIX
?????,perHostConfiguration};
??}else{
???return new String[]{
????DEFAULT_CONFIG_LOCATION,perHostConfiguration};
??}
?}
}

這種主要是通過動(dòng)態(tài)的獲取主機(jī)名來動(dòng)態(tài)配置的。所以對(duì)于不同的環(huán)境使用applicationContext-[hostname].xml就可以封裝變化了。當(dāng)然了,也可以不用hostname(如果發(fā)現(xiàn)其他方便的方式)

接下來,就是在web.xml中增加配置:

<context-param>
??<param-name>contextClass</param-name>
??<param-value>com.xiebing.spring.util.PerHostXmlWebApplicationContext</param-value>
?</context-param>

這種方法就是要求在不同的環(huán)境下有不同的applicationContext-[hostname].xml文件