通常springMVC和Spring的整合過程當中,咱們喜歡配置兩個文件application-*.xml和springmvc-.xml,可是配置很差的話,很容易出現這樣的問題:Injection of resource dependencies failed; nested exception is org.springfra......,也就是注入bean失敗的問題。web
通常對文件的配置喜歡<context:component-scan base-package="com.edu"/>這樣的話,能夠掃描整個包下面的文件,可是也會致使效率的問題,由於是掃描這個包下面全部的controller、service和bean等。另一種方法是,掃描的具體的包,一個一個配置,可是這樣有很繁瑣。spring
因此咱們會採用這樣的配置:express
<context:component-scan base-package="com.edu" >
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>mvc
利用use-default-filters和context:include-filter屬性來進行區別,這樣的話就能夠根據本身的須要來掃描那個層,是controller仍是service層。可是這樣話,有些類就可能注入不進來,致使出現這樣的問題:Injection of resource dependencies failed; nested exception is org.springfra......app
2.解決方案component
由於上面的問題,因此咱們須要對區別application-*.xml和springmvc-.xml非常瞭解。通常我喜歡把controller層springmvc-.xml文件中,service層配置在application-*.xml中。xml
因此springmvc-.xml也是處理controller層相關的註解,而application-*.xml通常配置其餘,好比出c3po0等。可是也會致使出現:Injection of resource dependencies failed; nested exception is org.springfra......,因此通常狀況下我會把<mvc:annotation-driven ></mvc:annotation>等註解配置在 <context:component-scan />的前面,由於 <context:component-scan /> ,會自動注入@controller等註解。這又涉及到<mvc:annotation-driven >和<context:component-scan />他們兩個註解之間的區別。ci
第二個區別就是application-*.xml和springmvc-*.xml的加載順序是不同的,因此必定分清楚,那些要先加載的,應該放在application-*.xml中。由於這涉及到web.xml的加載順序問題。application-*.xml配置在<context-param>下,而springmvc-*.xml配置在servlet下面。根據web.xml的加載順序是:context-param -> listener -> filter -> servlet。也能夠說是按照加載順序來配置文件的。servlet