在 Java项目中,可以通过多种方式获取当前应用的端口号。以下是几种常见的方法:
1、通过 Environment 获取端口号
在应用程序的运行时需要动态获取端口号,可以通过 Environment 对象来获取当前配置的端口号。Spring Boot 将 server.port 属性自动加载到环境变量中。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.context.WebServerApplicationContext;
import org.springframework.stereotype.Component;
@Component
public class PortFetcher {
@Autowired
private WebServerApplicationContext webServerAppContext;
public int getPort() {
return webServerAppContext.getWebServer().getPort();
}
}
在上述代码中,我们通过
WebServerApplicationContext 获取当前 Web 服务器的端口号。如果你在 Spring Boot 项目中使用的是内嵌的 Tomcat、Undertow,getPort() 方法将返回实际使用的端口号。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
//项目启动的时候就可以获取端口号
@Component
public class StartupRunner {
@Autowired
private Environment env;
@PostConstruct
public void runAfterStartup() {
//获取项目启动的端口号
String portNo = env.getProperty("server.port", String.class);
//根据端口号,查询该网管相关的信息
logger.info("portNo = "+portNo+"===");
}
2、通过 ServletContext 来获取当前应用绑定的端口号:
import org.springframework.stereotype.Component;
import javax.servlet.ServletContext;
@Component
public class PortFetcher {
private final ServletContext servletContext;
public PortFetcher(ServletContext servletContext) {
this.servletContext = servletContext;
}
public String getServerPort() {
return servletContext.getServerInfo();
}
}
3、如果只是想获取配置文件中设置的端口号,可以通过 @Value 注解将配置文件中的值注入到 Spring Bean 中:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class PortFetcher {
//@Value("${server.port}") 会将配置文件中 server.port 的值注入到 port 变量中
@Value("${server.port}")
private int port;
public int getPort() {
return port;
}
}
4、通过 ServerProperties 获取端口号
import org.springframework.boot.web.server.WebServer;
import org.springframework.boot.web.server.WebServerApplicationContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class PortFetcher {
@Autowired
private WebServerApplicationContext context;
public int getPort() {
//WebServerApplicationContext 提供了一个 getWebServer() 方法,
//返回一个 WebServer 对象。通过该对象,可以获取当前应用的端口号。
WebServer webServer = context.getWebServer();
return webServer.getPort();
}
}
5、使用 ApplicationListener 获取端口号
Spring Boot 应用启动时,通过 ApplicationListener 获取端口号。使用
ApplicationEnvironmentPreparedEvent 或 ApplicationReadyEvent 来捕获应用启动后获取端口号。
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
@Component
public class PortFetcher implements ApplicationListener {
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
System.out.println("The application is running on port: " + event.getApplicationContext().getEnvironment().getProperty("server.port"));
}
}
总结:以上为在程序中动态获取端口号的方法,在实际应用中选择更贴切业务需求的方式;
本文暂时没有评论,来添加一个吧(●'◡'●)