**分析思路
启动服务器报404,一般是路径错误,文件找不到类,有时是配置文件单词写错,或则是符号缺胳膊少腿,或则多写了。
但是经过多次排查后,发现配置文件,路径均没有问题,index.jsp页面还是加载不出东西,查看控制台信息,如图所示:
根据控制台上的信息,我找到LanguageController这个类,将它自动装配的属性的注解由以前的:
@Autowired
private ResourceBundleMessageSource messageSource;
改为:
@Autowired(required=true)
private ResourceBundleMessageSource messageSource;再次启动,发现页面还是加载不出来,然后将又它改成:
@Autowired(required=false)
private ResourceBundleMessageSource messageSource;再次启就可以了。
原因:
Spring.xml相当于是一个在外面的大容器(父亲),而SpringMVC.xml相当于是Speing.xml里面的小容器(儿子),
又继承关系可知:儿子可以继承父亲的东西(SpringMVC.xml可以访问Spring.xml里面的类容),而父亲却没有儿子遗传变异的基因(Spring.xml却不能访问SpeingMVC.xml里面的东西)。
在容器启动时,会先加载父容器,后加载子容器,容器中的初始化也已经完成,所以Controller中的Service可以正常注入(父亲注入儿子,儿子不能注入父亲),但是当前容器不能自己注入自己(父亲不能注入自己,儿子也不能注入自己),注入不进去又会一直注入,陷入死循环,找不到要注入的bean。
required属性
@Autowired(required=true):当使用@Autowired注解的时候,其实默认就是@Autowired(required=true),表示注入的时候,该bean必须存在,否则就会注入失败。
@Autowired(required=false):表示忽略当前要注入的bean,如果有直接注入,没有跳过,不会报错。