zoukankan      html  css  js  c++  java
  • 使用spring等框架的web程序在Tomcat下的启动顺序及思路理清

    http://www.cnblogs.com/panxuejun/p/5847774.html

    首先,springmvc实现了servlet,在web.xml中配置servlet class 为:org.springframework.web.servlet.DispatcherServlet,可以接管http请求,

    其次,在启动时 org.springframework.web.context.ContextLoaderListener注册了listener,在容器启动时它的方法会被调用,从而实现读取applicationContext-*.xml 内容注册bean,以及扫描 component-scan 定义的包路径下的@compent等注解来注册bean,为后续依赖注入打下基础。

    总结:

    注册bean有两种方式:

    1 在applicationContext-*.xml中声明

    2 component-scan 定义的包路径下对于类加上@compent,@service的注解。

    大牛请绕过,此文仅针对自己小白水平,对web程序的启动流程做个清晰的回顾。

    一.使用spring等框架的web程序在Tomcat下的启动流程

    1)Tomcat是根据web.xml来启动的。首先到web.xml

    2)web.xml中负责启动spring和spring mvc。对应的启动配置文件分别是

    启动spring mvc,并进行所有资源路径映射

    复制代码
    <servlet>
    <servlet-name>springMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/cfg/springmvc-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
    <servlet-name>springMVC</servlet-name>
    <url-pattern>/</url-pattern>
    </servlet-mapping>
    复制代码

    启动spring,通过ContextLoaderListener

    1
    2
    3
    4
    5
    6
    7
     <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/cfg/spring.xml</param-value>
    </context-param>

    3)spring中对一些orm框架的启动,包括Mybatis/hibernate。orm框架的启动基本都是通过sqlsessionFactory bean来启动的。

        并配置各种bean到ioc容器中。包括datasource等。

    4)web应用程序中,spring相当于程序运行的平台,spring对整个程序提高供ioc支持和aop支持。

    spring提供注解如@service @repository @component将各种类注册到ioc容器中。通过设置scan package的方式,spring在启动时候会扫描包下的所有注解,并将它们注册到ioc容器中。并针对@autowired @resource,将一些bean从ioc容器中获取填充到bean的构造属性中。

    spring会自动扫描如下包中的注解:

    <context:component-scan base-package=”pagkage1[,pagkage2,…,pagkageN]”/>

    以上可以看出spring所有的bean注入都是在spring.xml中配置的,所有的bean注入都在spring.xml中配置的。

    @autowired @resource只针对于类的成员变量,不针对方法里的局部变量。

    注:正是spring的ioc支持了controller层注入service,service注入dao。打通了各层之间的桥梁,省去了原来的new service(),new Dao()的方法。

    问答

    1.使用spring ioc有什么好处?

    答:网上有很多介绍使用Spring IOC容器的好处的文章,我看到的主要有两点, 
    1.方便测试,当需要测试的类依赖其他的类时,可以为依赖的类做个mock,然后注入进来。 
    2.方便维护及升级,当某个类需要修改实现时,只要接口没变,则无需修改源代码,重写一个实现类,修改下配置即可。 

    3.默认下,IOC容器管理的bean都是单例的,不会被gc掉。

    4.spring提倡面向接口开发,因此在servcie里面的dao直接是接口就可以了。这样有助于解耦。(测试等等)。。 

    如果不用spring,要么自己new daoimpl,就面向具体了,如果还想抽象,就必须自己写工厂——其实spring就是一个工厂IOC。实现类似的作用。 

    其实,面向抽象是实现和接口分离,对于多数的项目,实现大量变化的机会不是很大,因此直接面向具体(省略掉dao接口等)是我个人推荐的做法。 

    spring工厂对其中的对象的生命周期,作用范围都有很明确的定义,很容易使用,如果自己做这么一套,只怕没这么好。 

    第三,spring对ioc管理的对象,可以做很多增强,比如aop,代理等等。 

    5.感觉AOP最有用了。

    2.spring是怎样支持面向接口编程的?

    由于依赖于接口,可以通过依赖注入随时替换DAO接口的实现类,而应用程序完全不用了解接口与底层数据库操作细节。

    应用程序----调用-----》DAO接口《---实现--DAO接口实现类----操作------》数据库

    Spring MVC配置

    org.springframework.web.context.ContextLoaderListener

    ContextLoaderListener的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。

    ApplicationContext.xml这个配置文件部署: 如果在web.xml中不写任何参数配置信息,默认的路径是”/WEB-INF/applicationContext.xml,在WEB-INF目录下创建的xml文件的名称必须是applicationContext.xml。如果是要自定义文件名可在web.xml里加入contextConfigLocation这个context参数:

    <context-param> 

    <param-name>contextConfigLocation</param-name> 

    <param-value> 

     /WEB-INF/classes/applicationContext-*.xml 

    </param-value> 

    </context-param>

    在<param-value> </param-value>里指定相应的xml文件名;如果有多个xml文件,可写在一起并一“,”号分隔。上面的applicationContext-*.xml采用通配符,比如这那个目录下有applicationContext-ibatis-base.xml,applicationContext-action.xml,applicationContext-ibatis-dao.xml等文件,都会一同被载入。

    由此可见applicationContext.xml的文件位置就可以有两种默认实现:

    第一种:直接将之放到/WEB-INF下,并在web.xml中声明一个listener。

    第二种:放到classpath下,且需在web.xml中加入<context-param>,用它来指明你的applicationContext.xml的位置以供web容器来加载。

     

     

    web.xml 中的CONTEXT-PARAM就是一个键值对,可以理解成一个map,放入数据后,由程序自己去解析。

     

    了解web.xml加载个配置的顺序对解决一些配置BUG大有帮助,文本将介绍web.xml的加载顺序,并且结合一个实际的问题来进一步说明。

    1. context-param. 把key-value对读入内存
    2. listener. 按照web.xml中定义的顺序初始化各个listener
    3. filter. 按照web.xml中定义的顺序初始化各个filter
    4. spring-applicationContext. 加载spring中的beans

     前言:一般的web工程中都会用到web.xml,web.xml主要用来配置,可以方便的开发web工程。web.xml主要用来配置Filter、Listener、Servlet等。但是要说明的是web.xml并不是必须的,一个web工程可以没有web.xml文件。

    1、WEB工程加载web.xml过程

      经过个人测试,WEB工程加载顺序与元素节点在文件中的配置顺序无关。即不会因为 filter 写在 listener 的前面而会先加载 filter。WEB容器的加载顺序是:ServletContext -> context-param -> listener -> filter -> servlet。并且这些元素可以配置在文件中的任意位置。

      加载过程顺序如下:

    1. 启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点。 
    2. 紧急着,容创建一个ServletContext(servlet上下文),这个web项目的所有部分都将共享这个上下文。 
    3. 容器将<context-param>转换为键值对,并交给servletContext。 
    4. 容器创建<listener>中的类实例,创建监听器。 
  • 相关阅读:
    Jmeter——引入第三方jar包
    Linux系统中安装和卸载node
    Element和Event中的各种offsetTop,clientTop,scrollTop等位置
    关于Linux下LaTeX无法找到已安装字体的问题与解决
    Ubuntu 21.04 使用命令行分配静态IP地址
    批量下载YouTube播放列表(playlist)视频、字幕
    修改tomcat的server.xml,context.xml文件后又自动还原问题
    Echarts legend属性设置
    剑指-30:包含min函数的栈
    无网安装Docker及Docker镜像的导入导出
  • 原文地址:https://www.cnblogs.com/diegodu/p/7201711.html
Copyright © 2011-2022 走看看