zoukankan      html  css  js  c++  java
  • java 爬坑记-@WebServlet异步 不支持@Autowired

    上篇文章解决了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 的接口,直接拿过来用吧....

  • 相关阅读:
    HDU 6106 Classes【水题】
    HDU 6106 Classes【水题】
    ACM常用解题技巧方法
    ACM常用解题技巧方法
    程序员语录
    数据库设计的三大范式
    IDEA中Java代码存入DB中为乱码
    IDEA中如何添加jar包
    Java的Protected
    Hibernate JPA 如何使用SQL文直接查询
  • 原文地址:https://www.cnblogs.com/zuochanzi/p/9856041.html
Copyright © 2011-2022 走看看