使用Spring与原生Servlet时遇到的问题——bean无法注入

背景

这学期开设了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获取。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值