当前位置:   article > 正文

SpringBoot动态获取项目部署的端口号_springboot 获取端口号

springboot 获取端口号

参考:通过Spring boot编码获取当前程序运行的host和端口号_不当初-CSDN博客

这里总共涉及,两种不同启动方式下的获取方法,

分别是Springboot以内置的tomcat启动和以外部tomcat方式启动

第一种,当Springboot以内置的tomcat启动的时候,直接采用Spring提供的ApplicationListener接口来监听项目的启动,在启动的时候获取到项目的端口号即可。

1)代码如下:

  1. import lombok.Getter;
  2. import org.springframework.boot.web.context.WebServerInitializedEvent;
  3. import org.springframework.context.ApplicationListener;
  4. import org.springframework.stereotype.Component;
  5. /**
  6. * @className: ServerConfig
  7. * @author: wang
  8. * @date: 2021/12/7
  9. **/
  10. @Getter
  11. @Component
  12. public class ServerConfig implements ApplicationListener<WebServerInitializedEvent> {
  13. private Integer port;
  14. @Override
  15. public void onApplicationEvent(WebServerInitializedEvent webServerInitializedEvent) {
  16. this.port = webServerInitializedEvent.getWebServer().getPort();
  17. }
  18. }

这个代码记得加上@Component或者@Configuration等注解。

使用的时候,需要用注解的方式装配对象,new实例出来的会报错

这种方式获取到的端口号,其实就是写在application配置文件中的端口号。与其这样获取,不如直接使用@Value注解去配置文件中获取。

如果要想拿到tomcat的端口号

可以采用下面这种方式,但这种方式拿到的都是内置tomcat的端口号,默认都是8080,意义不大

  1. package com.piesat.config;
  2. import lombok.Data;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.boot.web.server.WebServerFactoryCustomizer;
  6. import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.stereotype.Component;
  9. /**
  10. * @className: WebServerConfig
  11. * @author: wang
  12. * @date: 2021/12/7
  13. **/
  14. @Component
  15. @Data
  16. public class TomcatServerConfig {
  17. private static final Logger logger = LoggerFactory.getLogger(TomcatServerConfig.class);
  18. private Integer serverPort;
  19. @Bean
  20. public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> webServerFactoryCustomizer() {
  21. return factory -> {
  22. int serverPort = factory.getWebServer().getPort();
  23. TomcatServerConfigHolder.webServerConfig.setServerPort(serverPort);
  24. logger.error(">>>>>>>>>>>>>>>>>>port:[{}]<<<<<<<<<<<<<<<<<<", serverPort);
  25. };
  26. }
  27. private TomcatServerConfig() {
  28. }
  29. private static class TomcatServerConfigHolder {
  30. private static final TomcatServerConfig webServerConfig = new TomcatServerConfig();
  31. }
  32. public static TomcatServerConfig getInstance() {
  33. return TomcatServerConfigHolder.webServerConfig;
  34. }
  35. }

2)如果不想使用注解的方式,可以采用静态内部类的方式(对应图一)。

  1. import lombok.Data;
  2. import org.springframework.boot.web.context.WebServerInitializedEvent;
  3. import org.springframework.context.ApplicationListener;
  4. import org.springframework.stereotype.Component;
  5. /**
  6. * @className: ServerConfig
  7. * @author: wang
  8. * @date: 2021/12/7
  9. **/
  10. @Component
  11. @Data
  12. public class ServerConfig implements ApplicationListener<WebServerInitializedEvent> {
  13. private Integer serverPort;
  14. @Override
  15. public void onApplicationEvent(WebServerInitializedEvent webServerInitializedEvent) {
  16. int port = webServerInitializedEvent.getWebServer().getPort();
  17. ServerConfigHolder.serverConfig.setServerPort(port);
  18. }
  19. private ServerConfig() {
  20. }
  21. private static class ServerConfigHolder {
  22. private static final ServerConfig serverConfig = new ServerConfig();
  23. }
  24. public static ServerConfig getInstance() {
  25. return ServerConfigHolder.serverConfig;
  26. }
  27. }

使用的方法如下,效果一样

上面这种写法,只适合springboot2.0之后,1.+没有WebServerInitializedEvent类,需要换成EmbeddedServletContainerInitializedEvent

因为2.0之后,Springboot就将EmbeddedServletContainerInitializedEvent 给修改成WebServerInitializedEvent

简单的示例如下,也可以修改成上面静态内部类的方式                                                        

  1. import org.springframework.boot.context.embedded.EmbeddedServletContainerInitializedEvent;
  2. import org.springframework.context.ApplicationListener;
  3. import org.springframework.stereotype.Component;
  4. /**
  5. * @className: ServerConfig
  6. * @date: 2021/12/7
  7. * spring boot 1.5.X
  8. **/
  9. @Component
  10. public class ServerConfig implements ApplicationListener<EmbeddedServletContainerInitializedEvent> {
  11. private Integer port;
  12. @Override
  13. public void onApplicationEvent(EmbeddedServletContainerInitializedEvent event) {
  14. this.port = event.getEmbeddedServletContainer().getPort();
  15. }
  16. public Integer getPort(){
  17. return port;
  18. }
  19. }

第二种、当Springboot,打成War包,放到外部tomcat中部署的时候,就需要剔除内置的tomcat容器,此时Springboot的启动流程就和上面不一样,好像就不再有初始化WebServer的步骤了,详细步骤需要看下源码。

这个时候,项目的端口就取决于外部的tomcat配置文件是如何配置的了。

代码如下:

  1. import javax.management.*;
  2. import java.lang.management.ManagementFactory;
  3. import java.util.Set;
  4. /**
  5. * @className: TomcatPortConfig
  6. * @author: wang
  7. * @date: 2021/12/7
  8. **/
  9. public class TomcatPortConfig {
  10. public static String getPort() {
  11. MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer();
  12. try {
  13. QueryExp protocol = Query.match(Query.attr("protocol"), Query.value("HTTP/1.1"));
  14. ObjectName name = new ObjectName("*:type=Connector,*");
  15. Set<ObjectName> objectNames = beanServer.queryNames(name, protocol);
  16. for (ObjectName objectName : objectNames) {
  17. String catalina = objectName.getDomain();
  18. if ("Catalina".equals(catalina)) {
  19. return objectName.getKeyProperty("port");
  20. }
  21. }
  22. } catch (MalformedObjectNameException e) {
  23. e.printStackTrace();
  24. }
  25. return null;
  26. }
  27. }

这两种方式,第一个适用于采用java -jar ***.jar的方式部署的,第二种适合,采用打成War包,部署到tomcat中进行启动的。方法不能搞反,否则都报空指针异常

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/707219
推荐阅读
相关标签
  

闽ICP备14008679号