我們先看下這兩個(gè)東東的配置方法: 對(duì)于contextConfigLocation參數(shù),有2個(gè)地方可以配置: 1)context-param 是全局性配置 2)servlet下的init-param 是局部性配置 若以上兩處都設(shè)置了一個(gè)相同的bean配置文件路徑,那么該文件內(nèi)配置的bean會(huì)被初始化2次,所以一個(gè)配置文件只能選擇一種配置位置; 項(xiàng)目中使用spring框架有2種方式: 1)listener下的ContextLoaderListener 是一種引入方式,默認(rèn)讀取/WEB-INF/applicationContext.xml 2)若是spring-web項(xiàng)目,DispatcherServlet 也是一種引入方式,默認(rèn)讀取/WEB-INF/${servlet-name}-servlet.xml 倘若以上2種配置都引入了,那么全局性的bean配置文件會(huì)被加載2次;而且2種方式的各自配置文件里的配置項(xiàng)在某種意義上并不是合并互補(bǔ),而是各成一個(gè)體系(雖然普通的bean看似是都加載到全局上下文來了,但還是有一些特殊bean和配置項(xiàng)沒有按預(yù)期的那樣工作); 比如/WEB-INF/applicationContext.xml文件下里的AOP聲明式配置: <!--aop 行為--> 若只是在全局配置項(xiàng)中,而沒有在DispatcherServlet 中加載,那么此aop會(huì)無效。 所以,在web項(xiàng)目中,就不要使用ContextLoaderListener 和全局配置contextConfigLocation參數(shù)了,統(tǒng)一在DispatcherServlet 下配置,應(yīng)該就不那么混亂了。如下: 這樣結(jié)果就如我們的預(yù)期:多bean配置文件不會(huì)出現(xiàn)重復(fù)加載,所有aop配置也都生效。 以上論點(diǎn)是在spring4.3.1下親測(cè)所得,當(dāng)然是從表現(xiàn)猜測(cè)本質(zhì)的,還沒有真正去研讀Spring的源碼,所以若有原理說錯(cuò)之處,還望各位看官指出! |
|