Spring Boot 教程

配置服务端口

有时候我们可能需要在同一台机器上启动多个 Spring Boot 应用,而 Spring Boot 应用默认的端口号是 8080。所以这时候我们就需要修改 Spring Boot 应用的默认端口,修改 Spring Boot 默认端口有两种方式。下面就分别说一下这两种方式:

修改 application.properties 或 application.yml 文件

在 Spring Boot 中,我们可以通过修改 application.properties 属性文件,或修改 application.yml YAML 文件。如下:

(1)修改 application.properties 属性文件

server.port=8081

(2)修改 application.yml YAML 文件

server:
  port: 8081

启动 Spring Boot 应用,使用 http://localhost:8081 地址进行访问。

为什么上面可以通过配置实现修改 Spring Boot 的默认端口呢?这是由 Spring Boot 的 ServerProperties 类实现的,该类的部分代码如下:

@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties {

	/**
	 * Server HTTP port.
	 */
	private Integer port;

	/**
	 * Network address to which the server should bind.
	 */
	private InetAddress address;

	// ... 忽略代码 ...
}

在 ServerProperties 源码上面使用了 @ConfigurationProperties 注解修饰,这个注解会自动读取 Spring Boot 的默认配置文件 application.properties(或 application.yml)的值,且仅仅将带有 server 前缀的属性注入到该 Bean。因此,server.port 将会被注入到 ServerProperties 类的 port 成员变量。

使用 IDEA 打开 ServletWebServerFactoryCustomizer 类的源码,其中有个 customize(ConfigurableServletWebServerFactory factory) 方法,该方法源码如下:

@Override
public void customize(ConfigurableServletWebServerFactory factory) {
    PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
    map.from(this.serverProperties::getPort).to(factory::setPort);
    map.from(this.serverProperties::getAddress).to(factory::setAddress);
    map.from(this.serverProperties.getServlet()::getContextPath)
            .to(factory::setContextPath);
    map.from(this.serverProperties.getServlet()::getApplicationDisplayName)
            .to(factory::setDisplayName);
    map.from(this.serverProperties.getServlet()::getSession).to(factory::setSession);
    map.from(this.serverProperties::getSsl).to(factory::setSsl);
    map.from(this.serverProperties.getServlet()::getJsp).to(factory::setJsp);
    map.from(this.serverProperties::getCompression).to(factory::setCompression);
    map.from(this.serverProperties::getHttp2).to(factory::setHttp2);
    map.from(this.serverProperties::getServerHeader).to(factory::setServerHeader);
    map.from(this.serverProperties.getServlet()::getContextParameters)
            .to(factory::setInitParameters);
}

上面代码中,map.from(this.serverProperties::getPort).to(factory::setPort) 用于将我们自定义的端口设置到 ConfigurableServletWebServerFactory 实例。注意:上面的双冒号(::)是 JDK8 语法。

并且,ServletWebServerFactoryCustomizer Bean 是在 ServletWebServerFactoryAutoConfiguration 配置配中进行配置,代码如下:

@Configuration
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@ConditionalOnClass(ServletRequest.class)
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
        ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
        ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
        ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {

    @Bean
    public ServletWebServerFactoryCustomizer servletWebServerFactoryCustomizer(
            ServerProperties serverProperties) {
        return new ServletWebServerFactoryCustomizer(serverProperties);
    }
    // ...忽略其他代码...
}

实现 WebServerFactoryCustomizer 类

上面介绍了通过属性配置或 YAML 配置 HTTP 端口,实际上这些端口最终是通过 ServletWebServerFactoryCustomizer 类的 customize(ConfigurableServletWebServerFactory factory) 方法进行设置的。

然而 customize(ConfigurableServletWebServerFactory factory) 方法的声明来自 WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> 接口,如果我们需要自己通过代码去设置 HTTP 端口,可以实现 WebServerFactoryCustomizer 接口,然后通过 @Configuration 和 @Bean 注解将自定义的类配置到 Spring Boot。

自定义 WebServerFactoryCustomizer 代码如下:

import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;

public class MyWebServerFactoryCustomizer implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {

    @Override
    public void customize(ConfigurableServletWebServerFactory factory) {
        factory.setPort(8081);
    }
}

创建一个自己的 @Configuration 类,将自定义的 MyWebServerFactoryCustomizer 类配置到 Spring Boot,例如:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyConfig {

    @Bean
    public MyWebServerFactoryCustomizer myWebServerFactoryCustomizer() {
        System.out.println("Init MyWebServerFactoryCustomizer()");
        return new MyWebServerFactoryCustomizer();
    }

}

完成上面编码后,启动 Spring Boot 应用程序即可。

更多 server 相关配置

  • server.address:指定server绑定的地址

  • server.compression.enabled:是否开启压缩,默认为false

  • server.compression.excluded-user-agents:指定不压缩的user-agent,多个以逗号分隔,默认值为:text/html, text/xml, text/plain, text/css

  • server.compression.mime-types:指定要压缩的 MIME type,多个以逗号分隔

  • server.compression.min-response-size:执行压缩的阈值,默认为 2048

  • server.context-parameters.[param name]:设置 servlet context 参数

  • server.context-path:设定应用的 context-path(如设置 context-path=server.context-path,所以访问的路径前缀都要有/springboot)

  • server.display-name:设定应用的展示名称,默认: application

  • server.jsp-servlet.class-name:设定编译JSP用的servlet,默认: org.apache.jasper.servlet.JspServlet)

  • server.jsp-servlet.init-parameters.[param name]:设置 JSP servlet 初始化参数

  • server.jsp-servlet.registered:设定JSP servlet是否注册到内嵌的servlet容器,默认true

  • server.port:设定http监听端口

  • server.servlet-path:设定dispatcher servlet的监听路径,默认为: /

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号