1.项目配置说明
一般springMVC和Spring的整合过程中,我们喜欢配置两个文件application-*.xml和springmvc-.xml,但是配置不好的话,很容易出现这样的问题:Injection of resource dependencies failed; nested exception is org.springfra…,也就是注入bean失败的问题。
一般对文件的配置喜欢<context:component-scan base-package=“com.edu”/>这样的话,可以扫描整个包下面的文件,但是也会导致效率的问题,因为是扫描这个包下面所有的controller、service和bean等。另外一种方法是,扫描的具体的包,一个一个配置,但是这样有很繁琐。
所以我们会采用这样的配置:
<context:component-scan base-package="com.edu" >
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
利用use-default-filters和context:include-filter属性来进行区别,这样的话就可以根据自己的需要来扫描那个层,是controller还是service层。但是这样话,有些类就可能注入不进来,导致出现这样的问题:Injection of resource dependencies failed; nested exception is org.springfra…
2.解决方案
因为上面的问题,所以我们需要对区别application-.xml和springmvc-.xml很是了解。一般我喜欢把controller层springmvc-.xml文件中,service层配置在application-.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 />他们两个注解之间的区别。
第二个区别就是application-.xml和springmvc-.xml的加载顺序是不一样的,所以一定分清楚,那些要先加载的,应该放在application-.xml中。因为这涉及到web.xml的加载顺序问题。application-.xml配置在下,而springmvc-*.xml配置在servlet下面。根据web.xml的加载顺序是:context-param -> listener -> filter -> servlet。也可以说是按照加载顺序来配置文件的。