上篇文章解决了500那个错误, 程序能接受到request ,进行到调用service 服务时,提示线程空指针异常, 检查发现

//@Autowired
//OpHistoryService ophistoryservice;  类似这个 没注入成功,当然调用时 是个null ,空指针了...

有人介绍说

、 Spring不能通过注解向Servlet中注入实例的原理

        想了解此问题的原理,就要了解tomcat启动后 servlet和spring的加载顺讯。

      1、  tomcat启动后先加载web.xml文件。web.xml主要配置了servlet 、filter、listenner三种javaee规范的类,加载顺序跟在web.xml文档

中的位置无关。  顺序为  listenner>filter>servlet 。

2、而spring的初始化类为org.springframework.web.context.ContextLoaderListener,就是一个listenner,它是先于servlet加载的。普通servlet和springmvc的入口servlet

的加载顺序,就要看servle的设置了。
       3、在 servlet A类上加@service或@controllert等注解时,spring或springmvc会扫面相关包,自动实例化一个servlet 实例A;这个实例A的引用是spring容器管理的。
       4、当然 servlet也会在web.xml配置(要不然怎么拦截url),这是tomcat容器会根据servler配置启动时或者第一次请求该url时实例化该servlet 实例B,
这个实例B的引用是tomcat容器管理的。
      5、明白了吧,拦截url的servlet和spring依赖注入的servlet不是同一个实例!!所以就产生了不能依赖注入或者注解不起作用的现象。
--------------------- 
作者:享受编程_ 
来源:CSDN 
原文:https://blog.csdn.net/u013476542/article/details/57084825 
版权声明:本文为博主原创文章,转载请附上博文链接!

文章二

如果servlet中需要用到spring中的applicationContext,我们是没法直接通过@Autowired方式获取的,需要用如下方式:
WebApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
 
running = context.getBean("running");
为什么呢?
在tomcat中,一个url请求进来到处理,经过这些步骤:tomcat 启动,tomcat comtxt加载(在这儿是spring comtext加载,因为spring的comtext实现了tomcat中容器接口),filters,servletcontext启动。。。在这儿servlet和applicationContext是两个平级的概念。所以servlet只能够通过tomcat中的api来获取applicationContext对象。

还好spring留着程序员取bean 的接口,直接拿过来用吧....

 

posted on 2018-10-26 14:15  小石头的一天  阅读(1131)  评论(0编辑  收藏  举报