背景
这学期开设了javaweb与相关的实训课,实训课需要做一个web项目。为了体现web课的成果。我们小组本来打算采用Spring Ioc + Servlet +Mybatis来完成实训项目。今天真正搭建环境时却出了问题。
问题
在定义好了Dao层与Service层后,准备在web层调用Service层。当浏览器发出请求时,发生空指针异常
排查
1.首先直接引用dao层,仍发现空指针错误。说明从dao层开始就注入失败
2.直接自动注入在Spring配置文件application.xml中配置的dataSource:仍然为空
于是我开始怀疑是不是项目根本没有解析application.xml
3.手动在application.xml制造错误,运行项目,结果爆出application的相关异常
说明之前项目也成功解析了application.xml,也意味着已经成功将内部配置的bean放入容器了。
转换思路,新建一个测试类,用java程序的方式启动Spring。
发现成功获取了相关bean并成功启动
4.于是开始怀疑是否为原生Servlet的原因:为了验证,在原项目中加入了SpringMVC相关依赖并配置了DispatcherServlet,运用@RequestMapping的方式访问原来的doGet方法,其余部分不变。
结果:项目成功运行。
结论
经过查找资料后,初步得出以下结论:
对于普通的使用了Spring的java程序来说,Ioc容器类型是ClassPathXmlApplication或FileSystemXmlApplication,对于使用了Web的java项目来说,Ioc容器是XmlWebApplication类型。在Ioc初始化时,它会将所有的信息以xml形式保存到servletContext域中,里面的信息只有经过SpringMVC才能成功解析。普通的Servlet无法解析或者说不会去解析里面的内容,导致无法完成依赖注入。
续
ContextListener只能被DispatcherServlet所引用,进而解析Ioc容器XmlWebApplication中的内容。
换句话说,在使用了Spring的web项目中,我们在Spring中配置的bean只能被DispatherServlet获取。