Spring Boot - 如何在不使用 spring 注释的情况下在运行时获取端口

Posted

技术标签:

【中文标题】Spring Boot - 如何在不使用 spring 注释的情况下在运行时获取端口【英文标题】:Spring Boot - How to get the port at runtime without using spring annotations 【发布时间】:2019-03-20 18:27:35 【问题描述】:

我有一个基于 aspectj 的通用 Java 代理,它在多个 Spring Boot 应用程序(和几个 Spring Boot 版本)上运行。 我试图找到一种在运行时获取端口的方法,在应用程序启动时(在发出请求之前)以编程方式。 问题——

    我无法使用常规方式获取 Spring Boot 端口,例如 https://***.com/questions/30312058/spring-boot-how-to-get-the-running-port 中描述的那些,其中包括 @Autowired 注释等。

    我正在应用程序启动后寻找端口,而不依赖于发出的请求。

我正在寻找一种方法来访问 LocalServerPort 对象或任何其他允许我访问端口的选项。

感谢您的帮助

【问题讨论】:

这听起来像是一个有问题的hacky情况(通常最好告诉应用程序使用哪个端口),但你可以尝试使用静态支架和设置的跑步者那里有一个值。 @LocalServerPort 仅用于测试而不是运行时。所以试图在运行时得到它只会失败,因为它不存在(它只是测试!)。代理应获取ServerProperties 并查看port,如果已设置则使用它,否则使用默认8080。但是仍然感觉很笨拙,并且看起来您正在尝试在错误的位置做事。 @chrylis 这确实不是一个标准案例,而是一个棘手的案例......你能给我举个例子来说明你所说的静态支架和跑步者的意思吗? 【参考方案1】:

经过一些调查,正如我提到的,我正在使用 aspectj,我使用了以下工具:

 after():
         execution(org.springframework.boot.context.embedded.EmbeddedServletContainer+.new(..))

并使用 getPort() 方法直接从 EmbeddedServletContainer 实例获取端口。 在 Tomcat 的情况下,如果端口为 -1,我使用嵌入式 tomcat 对象从连接器本身获取端口。

【讨论】:

以上是关于Spring Boot - 如何在不使用 spring 注释的情况下在运行时获取端口的主要内容,如果未能解决你的问题,请参考以下文章

spriing boot 实战

Spring Boot - 如何在不使用 spring 注释的情况下在运行时获取端口

如何在不从 spring-boot-starter-web 继承的情况下在 Spring Boot 中获取 ObjectMapper 实例?

如何使用多个主类运行 Spring Boot 项目

如何在不使用 Spring Boot 的情况下注入 Feign Client 并调用 REST Endpoint

如何在不覆盖 Spring Boot 使用的情况下定义自定义 ObjectMapper bean