springboot 2.0以上版本如何启动多端口监听@杨章隐

查了很多网上的教程,包括知乎高赞的,都是基于1.0的,springboot2.0已经遗弃一部分相关的class和方法或者类名方法名被修改导致有些入门着急找解决方案的朋友有点懵逼。所以写这篇东西

application.properties文件代码:

server.port=${appPort:8080}
server.additionalPorts=3050

创建一个 ApplicationConfig,代码如下 ,大部分的教程会让你用EmbeddedServletContainerCustomizer,但是Spring Boot2.0以上配置嵌入式Servlet容器时EmbeddedServletContainerCustomizer类被WebServerFactoryCustomizer替代

import com.mengyou.bowling.util.StringUtilDeer;
import org.apache.catalina.connector.Connector;
import org.springframework.boot.web.embedded.tomcat.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.ArrayList;
import java.util.List;

@Configuration
public class ApplicationConfig {

    @Value("${server.additionalPorts}")
    private String additionalPorts;

    @Bean
    public TomcatServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        Connector[] additionalConnectors = this.additionalConnector();
        if (additionalConnectors != null && additionalConnectors.length > 0) {
            tomcat.addAdditionalTomcatConnectors(additionalConnectors);
        }
        return tomcat;
    }

    private Connector[] additionalConnector() {
        if (StringUtilDeer.isEmpty(this.additionalPorts)) {//这里的isEmpty只是判断这个变量是否存在,StringUtilDeer是我封装的一个工具类,你可以修改成判断他的长度和是否等于null
            return null;
        }
        String[] ports = this.additionalPorts.split(",");
        List<Connector> result = new ArrayList<>();
        for (String port : ports) {
            Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
            connector.setScheme("http");
            connector.setPort(Integer.valueOf(port));
            result.add(connector);
        }
        return result.toArray(new Connector[] {});
    }
}

最后在我们springboot的启动类上增加@Import

@Import一些说明补充

1、@Import只能用在类上 ,@Import主要是通过快速导入的方式实现把实例加入到spring的IOC容器之中;

2、加入IOC容器的方式有很多种,@Import注解是其中一种,@Import注解也可以可以用于导入第三方包 ,当然使用@Bean也可以,主要看习惯

@SpringBootApplication
@Import({ApplicationConfig.class})
public class BowlingApplication {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(BowlingApplication.class, args);
    }

}

摸索参考

经验分享 程序员 微信小程序 职场和发展