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>中的类实例,创建监听器。 
  • 相关阅读:
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    基于分布式锁解决定时任务重复问题
    基于Redis的Setnx实现分布式锁
    基于数据库悲观锁的分布式锁
    使用锁解决电商中的超卖
  • 原文地址:https://www.cnblogs.com/diegodu/p/7201711.html
Copyright © 2011-2022 走看看