Spring 快速开始 启动Spring
【启动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的更多相关文章
- 8 -- 深入使用Spring -- 7...1 启动Spring 容器
8.7.1 启动Spring容器 对于使用Spring的Web应用,无须手动创建Spring容器,而是通过配置文件声明式地创建Spring容器.因此,在Web应用中创建Spring容器有如下两种方式: ...
- Spring 快速开始 配置Spring Framework
[配置Spring Framework] 1.XML配置依赖关系 bean是由Springframework管理,我们自己编写bean,Spring也内建了bean,比如ApplicationCont ...
- spring boot容器启动详解
目录 一.前言 二.容器启动 三.总结 =======正文分割线====== 一.前言 spring cloud大行其道的当下,如果不了解基本原理那么是很纠结的(看见的都是约定大于配置,但是原理呢?为 ...
- 快速搭建一个Spring Boot + MyBatis的开发框架
前言:Spring Boot的自动化配置确实非常强大,为了方便大家把项目迁移到Spring Boot,特意总结了一下如何快速搭建一个Spring Boot + MyBatis的简易文档,下面是简单的步 ...
- Spring Boot基础:Spring Boot简介与快速搭建(1)
1. Spring Boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的创建.运行.调试.部署等. Spring Boot默认使用tomca ...
- Spring Boot系列——Spring Boot如何启动
Spring Boot启动过程 上篇<Spring Boot系列--5分钟构建一个应用>介绍了如何快速创建一个Spring Boot项目并运行.虽然步骤少流程简单,为开发者省去了很多重复 ...
- 快速构建springmvc+spring+swagger2环境
快速构建springmvc+spring+swagger2环境 开发工具:Intellij idea jdk: 1.8 开发步骤: 1.创建maven工程,如图建立工程结构 ...
- 【IntelliJ Idea】idea快速创建maven spring项目
想试试AOP在spring的web项目上的使用情况,所以想尽快使用idea快速的搭建一个spring的web项目,当然,是maven管理的项目 步骤如下: 1.打开idea 左上角file---> ...
- 快速开发架构Spring Boot 从入门到精通 附源码
导读 篇幅较长,干货十足,阅读需花费点时间.珍惜原创,转载请注明出处,谢谢! Spring Boot基础 Spring Boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计 ...
随机推荐
- poj 3414 Pots(bfs+输出路径)
Description You are given two pots, having the volume of A and B liters respectively. The following ...
- 2019.4.1考试&2019.4.2考试&2019.4.4考试
4.1:T1原题,T2码农板子题,T3板子题 4.2 好像是三个出题人分别出的 以及#define *** 傻逼 T1 思维好题 转成树形DP,$dp[i][j]$表示点i值为j的方案数,记录前缀和转 ...
- 关于Java中扫描仪next()与nextLine()的区别
首先,next()一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键.Tab键或Enter键等结束符,next()方法会自动将其去掉,只有在输入有效字符之后,next()方法才将其后 ...
- anaconda的安装教程和使用方法
一.anaconda安装方法: 1.下载: anaconda官方下载地址:https://www.anaconda.com/download/ 2.安装: 可以自己指定路劲,也可以选择默认安装,最后记 ...
- IE jQuery ajax 请求缓存问题
我最近在IE下测试开发我们的系统,经常出现改过的jsp页面,刷新IE后也不能显示,这就是IE的缓存问题,查了一下百度,说是IE9在ajax进行请求时,如果两次请求url相同,则不会请求服务器,而是从缓 ...
- 项目管理干货——项目管理入门级书籍(附赠5G项目管理书籍电子版)
各位项目经理我们都是在不断的学习和自我学习中不断成长的,所以我们需要多看书,才能做好一个项目经理,但是很多人,在挑选书籍的时候犯了难,今天我就把自己学习的时候看的那些书单整理出来,大家有需要的可以留言 ...
- Day24--Python--常用模块03--正则表达式
正则表达式是对字符串操作的⼀种逻辑公式. 我们⼀般使⽤正则表达式对字符串进⾏匹配和过滤. 使⽤正则的优缺点: 优点: 灵活, 功能性强, 逻辑性强. 缺点: 上⼿难. ⼀旦上⼿, 会爱上这个东⻄ ⼯具 ...
- console控制台的小问题
第一个foo里面应该是123,但是当执行完下面的代码之后,console控制台会自动将里面的内容改成我们修改之后的
- hibernate的学习周
Hibernate核心:ORM(对象关系映射) BeginSession关闭的时候要session.close(),而getCurrentsession不需要,它会自动关闭 Session.load( ...
- 剑指Offer_编程题_4
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...