zoukankan      html  css  js  c++  java
  • SpringBoot高级-自动配置之切换内置web服务器

    前言:本篇介绍,通过利用SpringBoot的自动配置原理,实现切换内置web服务器

    我们都了解,当导入web起步依赖后,SpringBoot程序启动的时候,默认加载的就是tomcat服务器,实际上SpringBoot默认为我们提供了四种(Jetty、Netty、Tomcat、Undertow)服务器,我们可以很方便的切换服务器。

    查找源码路径

    这里我们重点关于EmbeddedWebServerFactoryCustomizerAutoConfiguration这个类,之前我有提到凡是SpringBoot提供的自动配置类,名称命名时,规则都是*AutoConfiguration。

    自动配置类释义:所谓自动配置类,就是当程序启动时,IOC容器会自动加载配置类,初始化配置类中的Bean,但是配置类中有些Bean是有条件成立时才能初始化

    继续回到解释EmbeddedWebServerFactoryCustomizerAutoConfiguration 这个类,此类上有一个注解@ConditionalOnWebApplication,表明是web程序时,方可生效,即:有web依赖时,此类才会在IOC容器自动加载。

    @Configuration
    @ConditionalOnWebApplication
    @EnableConfigurationProperties(ServerProperties.class)
    public class EmbeddedWebServerFactoryCustomizerAutoConfiguration {
    
    	/**
    	 * Nested configuration if Tomcat is being used.
    	 */
    	@Configuration
    	@ConditionalOnClass({ Tomcat.class, UpgradeProtocol.class })
    	public static class TomcatWebServerFactoryCustomizerConfiguration {
    
    		@Bean
    		public TomcatWebServerFactoryCustomizer tomcatWebServerFactoryCustomizer(Environment environment,
    				ServerProperties serverProperties) {
    			return new TomcatWebServerFactoryCustomizer(environment, serverProperties);
    		}
    
    	}
    
    	/**
    	 * Nested configuration if Jetty is being used.
    	 */
    	@Configuration
    	@ConditionalOnClass({ Server.class, Loader.class, WebAppContext.class })
    	public static class JettyWebServerFactoryCustomizerConfiguration {
    
    		@Bean
    		public JettyWebServerFactoryCustomizer jettyWebServerFactoryCustomizer(Environment environment,
    				ServerProperties serverProperties) {
    			return new JettyWebServerFactoryCustomizer(environment, serverProperties);
    		}
    
    	}
    
    	/**
    	 * Nested configuration if Undertow is being used.
    	 */
    	@Configuration
    	@ConditionalOnClass({ Undertow.class, SslClientAuthMode.class })
    	public static class UndertowWebServerFactoryCustomizerConfiguration {
    
    		@Bean
    		public UndertowWebServerFactoryCustomizer undertowWebServerFactoryCustomizer(Environment environment,
    				ServerProperties serverProperties) {
    			return new UndertowWebServerFactoryCustomizer(environment, serverProperties);
    		}
    
    	}
    
    	/**
    	 * Nested configuration if Netty is being used.
    	 */
    	@Configuration
    	@ConditionalOnClass(HttpServer.class)
    	public static class NettyWebServerFactoryCustomizerConfiguration {
    
    		@Bean
    		public NettyWebServerFactoryCustomizer nettyWebServerFactoryCustomizer(Environment environment,
    				ServerProperties serverProperties) {
    			return new NettyWebServerFactoryCustomizer(environment, serverProperties);
    		}
    
    	}
    
    }
    

    接着看我们都熟悉的关于初始化tomcat这个Bean,这个Bean上有一个注解@ConditionalOnClass({ Tomcat.class, UpgradeProtocol.class }),表示,当含有Tomcat和UpgradeProtocol这两个字节码文件时,才会初始化tomcat,这时,您心中就有疑问了,我只是引入了web依赖,并没有单独引入tomcat依赖啊,怎么会有这两个字节码文件呢?下面我们再看maven依赖传递图。

    一、首先导入web依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    

    二、打开maven依赖图

    三、分析本项目的依赖图,解释了为什么tomcat会自动变为默认的web服务器了,因为导入web依赖后,web依赖默认就包含了tomcat相关的jar,自然也包含那两个字节码文件了。

    下面,实现切换web服务器

    一、移除tomcat依赖,操作如下

    二、查看pom.xml中web依赖的变化,并导入jetty服务器依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <!--1、移除tomcat依赖(exclusions:排除)-->
        <exclusions>
            <exclusion>
                <artifactId>spring-boot-starter-tomcat</artifactId>
                <groupId>org.springframework.boot</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    
    <!--2、加入jetty依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jetty</artifactId>
    </dependency>
    

    三、启动程序,测试,如下,证明我们已经成功切换web服务器了。

    小结:切换web服务器,本质上还是利用了SpringBoot自动配置的原理实现的。

  • 相关阅读:
    (二十五)Struts2 Tiles集成
    (二十四)Struts2 Spring集成
    etcd 和 redis的使用场景
    react v16.12 源码阅读环境搭建
    gmail邮箱怎么批量删除邮件
    动态创建的元素怎么做动画
    Window 添加定时任务
    commons-pool2-中的一些配置
    Activiti 5.18 流程Model 转成 流程BPMN文件
    Activiti 使用自己的身份认证服务
  • 原文地址:https://www.cnblogs.com/elnimo/p/13789159.html
Copyright © 2011-2022 走看看