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 注释的情况下在运行时获取端口的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot - 如何在不使用 spring 注释的情况下在运行时获取端口
如何在不从 spring-boot-starter-web 继承的情况下在 Spring Boot 中获取 ObjectMapper 实例?