嵌入式Servlet容器:应用打成可执行的jar

  ​ 优点:简单、便携;

  ​ 缺点:默认不支持JSP、优化定制比较复杂(使用定制器【ServerProperties、自定义EmbeddedServletContainerCustomizer】,自己编写嵌入式Servlet容器的创建工厂【EmbeddedServletContainerFactory】);

  外置的Servlet容器:外面安装Tomcat---应用war包的方式打包;

  步骤

  1)、必须创建一个war项目;(利用idea创建好目录结构)

  2)、将嵌入式的Tomcat指定为provided;

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>

  3)、必须编写一个SpringBootServletInitializer的子类,并调用configure方法

public class ServletInitializer extends SpringBootServletInitializer {

   @Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
//传入SpringBoot应用的主程序
return application.sources(SpringBoot04WebJspApplication.class);
} }

  4)、启动服务器就可以使用;

  原理

  jar包:执行SpringBoot主类的main方法,启动ioc容器,创建嵌入式的Servlet容器;

  war包:启动服务器,服务器启动SpringBoot应用【SpringBootServletInitializer】,启动ioc容器;

  servlet3.0(Spring注解版):

  8.2.4 Shared libraries / runtimes pluggability:

  规则:

  ​ 1)、服务器启动(web应用启动)会创建当前web应用里面每一个jar包里面ServletContainerInitializer实例:

  ​ 2)、ServletContainerInitializer的实现放在jar包的META-INF/services文件夹下,有一个名为javax.servlet.ServletContainerInitializer的文件,内容就是ServletContainerInitializer的实现类的全类名

​   3)、还可以使用@HandlesTypes,在应用启动的时候加载我们感兴趣的类;

  流程:

  1)、启动Tomcat

  2)、org\springframework\spring-web\4.3.14.RELEASE\spring-web-4.3.14.RELEASE.jar!\META-INF\services\javax.servlet.ServletContainerInitializer:

Spring的web模块里面有这个文件:org.springframework.web.SpringServletContainerInitializer

  3)、SpringServletContainerInitializer将@HandlesTypes(WebApplicationInitializer.class)标注的所有这个类型的类都传入到onStartup方法的Set<Class<?>>;为这些WebApplicationInitializer类型的类创建实例;

  4)、每一个WebApplicationInitializer都调用自己的onStartup;

aaarticlea/png;base64,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" alt="" />

  5)、相当于我们的SpringBootServletInitializer的类会被创建对象,并执行onStartup方法

  6)、SpringBootServletInitializer实例执行onStartup的时候会createRootApplicationContext;创建容器

protected WebApplicationContext createRootApplicationContext(
ServletContext servletContext) {
//1、创建SpringApplicationBuilder
SpringApplicationBuilder builder = createSpringApplicationBuilder();
StandardServletEnvironment environment = new StandardServletEnvironment();
environment.initPropertySources(servletContext, null);
builder.environment(environment);
builder.main(getClass());
ApplicationContext parent = getExistingRootWebApplicationContext(servletContext);
if (parent != null) {
this.logger.info("Root context already created (using as parent).");
servletContext.setAttribute(
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, null);
builder.initializers(new ParentContextApplicationContextInitializer(parent));
}
builder.initializers(
new ServletContextApplicationContextInitializer(servletContext));
builder.contextClass(AnnotationConfigEmbeddedWebApplicationContext.class); //调用configure方法,子类重写了这个方法,将SpringBoot的主程序类传入了进来
builder = configure(builder); //使用builder创建一个Spring应用
SpringApplication application = builder.build();
if (application.getSources().isEmpty() && AnnotationUtils
.findAnnotation(getClass(), Configuration.class) != null) {
application.getSources().add(getClass());
}
Assert.state(!application.getSources().isEmpty(),
"No SpringApplication sources have been defined. Either override the "
+ "configure method or add an @Configuration annotation");
// Ensure error pages are registered
if (this.registerErrorPageFilter) {
application.getSources().add(ErrorPageFilterConfiguration.class);
}
//启动Spring应用
return run(application);
}

  7)、Spring的应用就启动并且创建IOC容器

public ConfigurableApplicationContext run(String... args) {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
ConfigurableApplicationContext context = null;
FailureAnalyzers analyzers = null;
configureHeadlessProperty();
SpringApplicationRunListeners listeners = getRunListeners(args);
listeners.starting();
try {
ApplicationArguments applicationArguments = new DefaultApplicationArguments(
args);
ConfigurableEnvironment environment = prepareEnvironment(listeners,
applicationArguments);
Banner printedBanner = printBanner(environment);
context = createApplicationContext();
analyzers = new FailureAnalyzers(context);
prepareContext(context, environment, listeners, applicationArguments,
printedBanner); //刷新IOC容器
refreshContext(context);
afterRefresh(context, applicationArguments);
listeners.finished(context, null);
stopWatch.stop();
if (this.logStartupInfo) {
new StartupInfoLogger(this.mainApplicationClass)
.logStarted(getApplicationLog(), stopWatch);
}
return context;
}
catch (Throwable ex) {
handleRunFailure(context, listeners, analyzers, ex);
throw new IllegalStateException(ex);
}
}

  启动Servlet容器,再启动SpringBoot应用

尚硅谷springboot学习27-使用外置servlet容器的更多相关文章

  1. 尚硅谷springboot学习26-嵌入式servlet容器自动配置、启动原理

    EmbeddedServletContainerAutoConfiguration:嵌入式的Servlet容器自动配置 @AutoConfigureOrder(Ordered.HIGHEST_PREC ...

  2. 尚硅谷springboot学习25-嵌入式Servlet容器

    SpringBoot默认使用Tomcat作为嵌入式的Servlet容器:

  3. 尚硅谷springboot学习14-自动配置原理

    配置文件能配置哪些属性 配置文件能配置的属性参照 自动配置的原理 1).SpringBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration 2).@Ena ...

  4. 尚硅谷springboot学习1-简介

    以前看过springboot的相关知识,当时偷懒没有做笔记,现在忘得已经差不多了,现在趁着过年有时间,再学习一遍,并做下笔记以备忘. 特性 Spring Boot来简化Spring应用开发,约定大于配 ...

  5. 尚硅谷springboot学习35-启动原理

    先列出几个重要的事件回调机制 配置在META-INF/spring.factories ApplicationContextInitializer SpringApplicationRunListen ...

  6. 尚硅谷springboot学习24-错误处理

    1.SpringBoot默认的错误处理机制 默认效果: ​ 1).浏览器,返回一个默认的错误页面

  7. 尚硅谷springboot学习23-SpringMVC配置

    1. Spring MVC auto-configuration 以下是SpringBoot对SpringMVC的默认配置:(WebMvcAutoConfiguration) Inclusion of ...

  8. 尚硅谷springboot学习5-主入口类说明

    package com.atguigu; import org.springframework.boot.SpringApplication; import org.springframework.b ...

  9. 尚硅谷springboot学习34-整合SpringData JPA

    SpringData简介

随机推荐

  1. Fescar Example-Spring Cloud

    项目说明 本项目演示如何使用 Fescar Starter 完成 Spring Cloud 应用的分布式事务接入. 准备工作 在运行此示例之前,你需要先完成如下几步准备工作: 配置数据库 创建 UND ...

  2. tp5 base64 图片上传

    /** * 保存图片 */ public function uploads($value='') { // $file = base64_decode(request()->file('imag ...

  3. L2-023. 图着色问题*

    L2-023. 图着色问题 参考博客 #include <iostream> #include <cstring> #include <set> using nam ...

  4. Vue2.0

    Vue 1.0到2.0的变化: 1.在每个组件的模板中,不再支持片段代码 组件中的模板: 之前: <template> <h3我是组件<strong>我是加粗模板< ...

  5. Linux下,用命令进行 日志分割、日志合并

    指定文件大小分割: split -b 10m catalina.out imsoft 以每个文本文件10M方式分割日志 文件合并: cat small_file* > large_file

  6. Centos7 下安装VMware tools

    1:先在虚拟机点击安装VMware Tools   2:然后挂载       mount /dev/cdrom /mnt 3:进入/mnt,可以看到有       4:拷贝VMwareTools到其他 ...

  7. create table 推荐规则

    create table 推荐规则: 所有列都设置NOT NULL,都写备注(comment) 除主键外,所有列都设置默认值(default)

  8. Day 09 函数基础

    函数初级 简介 # 函数是一系列代码的集合,用来完成某项特定的功能 优点 '''1. 避免代码的冗余2. 让程序代码结构更加清晰3. 让代码具有复用性,便于维护''' 函数四部分 '''1. 函数名: ...

  9. 京东返利渠道,自己拿返利,无需A推B操作

    京东返利渠道,自己拿返利,无需A推B操作,简单快捷方便 1.在微信小程序中搜索 “京东饭粒” 2.进入京东饭粒,进购物车下单(只能在购物车内下单返利) 3.收货后26天返京豆到你的京东账号中,”佛系返 ...

  10. echars柱状图修改每条柱的颜色

    在实际开发中,可能会需要到柱状图内某个柱需要特殊颜色表示,我这里的应用是排名,突出显示出当前的数据. 在Color参数中添加一个方法可以任意返回需要的颜色值 function (params) { i ...