【启动Spring必须配置】

【web.xml部署描述符方式】

1.配置Servlet级别上下文

<servlet>

  <servlet-name>springDispatcher</servlet-name>

  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

  <init-param>

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

    <param-value>/WEB-INF/servletContext.xml</param-value>

  </init-param>

  <load-on-startup>1</load-on-startup>

</servlet>

2.配置应用程序级别上下文,也叫根应用上下文。使用监听器是因为ContextLoaderListener实现了ServleContextListener所以会在应用程序启动时初始化。

<context-param>

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

  <param-value>/WEB-INF/rootContext.xml</param-value>

</context-param>

<listener>

  <listener-class>org.springframework.web.context.ContextLoaderListener</listen-class>

</listener>

通过ContextLoaderListener和DispatcherServlet将创建出XmlWebApplicationContext实例,

意为希望使用XML文件作为Spring配置。(AnnotationConfigWebApplicationContext是希望用类配置)

【初始化器使用编程方式启动Spring】

ServletContextListener 的缺点 contextInitialized方法可能在其他监听器方法之后。

JEE6 添加新接口 ServeltContainerInitializer 的onStartup方法在所有监听器启动之前调用。

一、1种不利的方式 使用Java服务提供系统声明实现了ServletContainerInitializer的一个或多个类,【在文件/META-INF/services/javax.servlet.ServletContainerInitializer列出这些类】

  com.wrox.config.ContainerInitializerOne

   com.wrox...不利在于文件不能直接存在WAR文件或Web程序的/META-INF/services,必须在JAR文件的/META-INF/services目录,然后把jar放到/WEB-INF/lib

二、SpringFramework提供桥接口,SpringServletContainerInitializer,桥的意思是在含有该类的JAR包中有一个服务提供文件列出该类名字。

扫描应用程序寻找WebApplicationInitializer接口实现,调用onStartup。我们就是通过WebApplicationInitializer实现类配置

(编程式配置监听器、Servlet、过滤器 )

public class Bootstrap implements WebApplicationInitializer{

  @Override

  public void onStartup(ServletContext container){

    XmlWebApplicationContext rootContext = new XmlWebApplicationContext();

    rootContext.setConfiguration("/WEB-INF/rootContext.xml");

    container.addListener(new ContextLoaderListener(rootContext));

    

    XmlWebApplicationContext servletContext = new XmlWebApplicationContext();

    servletContext.setConfiguration("/WEB-INF/servletContext.xml");

    ServletRegistration.Dynamic dispatcer = container.addServlet("springDispatcher",new DispatcherServlet(servletContext));

    dispatcher.setLoadOnStartup(1);

    dispatcher.addMapping("/");

  }

}

(纯Java配置启动Spring)

public class Bootstrap implements WebApplicationInitializer{

  @Override

  public void onStartup(ServletContext container){

    AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();

    rootContext.register(com.wrox.config.RootContextConfiguration.class);

    container.addListener(new ContextLoaderListener(rootContext));

    

    AnnotationConfigWebApplicationContext servletContext = new AnnotationConfigWebApplicationContext();

    servletContext.register(com.wrox.config.ServletContextConfiguration.class);

    ServeltRegistration.Dynamic dispatcher = container.addServlet("springDispatcher",new DispatcherServlet(servletContext));

    dispatcher.setLoadOnStartup(1);

    dispatcher.addMapping("/");

  }

}

【桌面程序、服务器守护进程】rootContext作为daemonContext和forkedProcessContext的父亲上下文。

(在web应用程序ContextLoaderListener和DispatcherServlet会自动设置父亲上下文,连start也不用我们调用,

而独立应用程序需要自己start自己stop,手动stop有点坑爹用resgisterShutdownHook回调达到jvm退出自动停止应用上下文。)

public class Bootstrap{

  public static void main(String... args){

    ClassPathXmlApplicationContext rootContext = new ClassPathXmlApplicationContext("com/wrox/config/rootContext.xml");

    FileSystemXmlApplicationContext daemonContext = new FileSystemXmlApplicationContext(new String[]{"file:/path/to/daemonContext.xml"},rootContext);

    AnnotationConfigApplicationContext forkedProcessContext = new AnnotationConfigApplicationContext(com.wrox.config.ProcessContextConfiguration.class);

    forkedProcessContext.setParent(rootContext);

    rootContext.start();

    rootContext.registerShutdownHook();

    daemonContext.start();

    daemonContext.registerShutdownHook();

    foredProcessContext.start();

    foredProcessContext.registerShutdownHook();

  }

}

【多年以来的mistake之一】

映射到/* 带星号的意思是 Servlet容器把JSP请求发送到DispatcherServlet,这不是我们想要的。(为什么会这么不智能?容器处理映射优先级先处理我们自定义的再到它自己的。)

假如我们要映射到应用程序的根 是【用一个/ 就足以响应所有URL】,并且Servlet容器的JSP机制仍然可以处理JSP请求。

【多年以来的mistake之二】

如果计划将DispatcherServlet映射到应用程序根,注意统计需要使用的静态资源类型,一些在线教程演示使用SpringFramework提供静态资源,这样做是mistake。

因为更具体的URL-Pattern总是会覆盖单单一个/,所以【允许Servlet容器提供静态资源】不仅简单又做对了,只需要将这些静态资源映射到名为default的Servlet上(Servlet容器提供的!)。

<servlet-mapping>

  <servlet-name>default</servlet-name>

  <url-pattern>/resources/*</url-pattern>

  <url-pattern>*.css</url-pattern>

  <url-pattern>*.js</url-pattern>

  <url-pattern>*.png</url-pattern>

  <url-pattern>*.gif</url-pattern>

</servlet-mapping>

或者 servletContext.getServletRegistration("default").addMapping("/resources/*","*.css","*.js","*.png",".gif",".jpg");

………………………………………………………………………………………………………………

Spring 快速开始 启动Spring的更多相关文章

  1. 8 -- 深入使用Spring -- 7...1 启动Spring 容器

    8.7.1 启动Spring容器 对于使用Spring的Web应用,无须手动创建Spring容器,而是通过配置文件声明式地创建Spring容器.因此,在Web应用中创建Spring容器有如下两种方式: ...

  2. Spring 快速开始 配置Spring Framework

    [配置Spring Framework] 1.XML配置依赖关系 bean是由Springframework管理,我们自己编写bean,Spring也内建了bean,比如ApplicationCont ...

  3. spring boot容器启动详解

    目录 一.前言 二.容器启动 三.总结 =======正文分割线====== 一.前言 spring cloud大行其道的当下,如果不了解基本原理那么是很纠结的(看见的都是约定大于配置,但是原理呢?为 ...

  4. 快速搭建一个Spring Boot + MyBatis的开发框架

    前言:Spring Boot的自动化配置确实非常强大,为了方便大家把项目迁移到Spring Boot,特意总结了一下如何快速搭建一个Spring Boot + MyBatis的简易文档,下面是简单的步 ...

  5. Spring Boot基础:Spring Boot简介与快速搭建(1)

    1. Spring Boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的创建.运行.调试.部署等. Spring Boot默认使用tomca ...

  6. Spring Boot系列——Spring Boot如何启动

    Spring Boot启动过程 ​上篇<Spring Boot系列--5分钟构建一个应用>介绍了如何快速创建一个Spring Boot项目并运行.虽然步骤少流程简单,为开发者省去了很多重复 ...

  7. 快速构建springmvc+spring+swagger2环境

    快速构建springmvc+spring+swagger2环境 开发工具:Intellij idea               jdk: 1.8 开发步骤: 1.创建maven工程,如图建立工程结构 ...

  8. 【IntelliJ Idea】idea快速创建maven spring项目

    想试试AOP在spring的web项目上的使用情况,所以想尽快使用idea快速的搭建一个spring的web项目,当然,是maven管理的项目 步骤如下: 1.打开idea 左上角file---> ...

  9. 快速开发架构Spring Boot 从入门到精通 附源码

    导读 篇幅较长,干货十足,阅读需花费点时间.珍惜原创,转载请注明出处,谢谢! Spring Boot基础 Spring Boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计 ...

随机推荐

  1. 20165223 实验三 敏捷开发与XP实践

    目录 一.实验报告封面 二.具体实验内容 (一)敏捷开发与XP实践-1 代码规范格式化 (二)敏捷开发与XP实践-2 添加搭档项目 (三)敏捷开发与XP实践-3 搭档代码重构 (四)敏捷开发与XP实践 ...

  2. Python3 与 C# 面向对象之~封装

      在线编程:https://mybinder.org/v2/gh/lotapp/BaseCode/master在线预览:http://github.lesschina.com/python/base ...

  3. Luogu--3381 【模板】最小费用最大流

    题目链接 3381 [模板]最小费用最大流 手写堆版本 dijkstra   400+ms 看来优先队列的常数好大 #include<bits/stdc++.h> using namesp ...

  4. nc 使用实例

    nc.exe -h即可看到各参数的使用方法.基本格式:nc [-options] hostname port[s] [ports] ...nc -l -p port [options] [hostna ...

  5. 跟我一起使用android Studio打包react-native项目的APK

    使用的是react-native的hello-world项目 第一步:创建项目 npm install -g yarn react-native-cli react-native init Aweso ...

  6. js或jQuery获取当前屏幕的各种高度

    Javascript: 网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网页可见区域宽: document.b ...

  7. php项目核心业务(增、删、改、查)(第三篇)

    对增删改查数据库的封装 //php对数据库的封装 //Mysql_fetach($sql)函数查询所有的 function Mysql_fetach($sql){ $conn=mysqli_conne ...

  8. 图形设计必备软件:CorelDRAW

    [CorelDRAW 激发创意] CorelDRAW Graphics Suite 是一款领先的图形设计软件,收到数百万专业人士.小型企业主以及全球设计爱好者的热捧.它可以提供无缝的图形.版面.插图. ...

  9. Dubbo管控台安装(zookeeper单机版)

    1. zookeeper安装(单机版):http://www.cnblogs.com/wangfajun/p/5251159.html  √ 注意:我这里的dubbo-admin.war是2.5.3版 ...

  10. CodeFirst+MySql开发

    CodeFirst+MySql开发简单入门 记录一下使用Mysql进行EF Codefirst方式开发的简单过程. 0.准备工作 安装MySql,mysql-connector-net,mysql-f ...