首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在web容器成功启动后在servlet或控制器上调用方法

如何在web容器成功启动后在servlet或控制器上调用方法
EN

Stack Overflow用户
提问于 2012-05-07 14:51:03
回答 2查看 536关注 0票数 2

我正在用Spring实现一个RESTful web服务。当服务启动时,它需要注册自己,以便客户能够找到它。我目前正在@Controller类的@PostConstruct方法中执行此操作。但是这会在服务真正准备好接收请求之前注册,因为web容器还没有侦听web请求。我更愿意在web容器完成所有初始化并侦听请求之后注册服务。

我寻找了一个侦听器和/或事件,它将在容器启动时通知我,但我没有找到一个。

我可能是“过早地优化”。最终的全部署环境需要负载平衡每个服务的一组副本,负载均衡器必须负责确定每个实例的实际服务可用性和当前负载。

编辑:额外的澄清。

我希望将服务注册到外部注册表中(特别是,在本例中,是实例)。我希望在应用服务器完成初始化并“面向业务开放”之前,不要将服务添加到注册表中。当我使用@PostConstruct (它似乎提供了与ServletContextListener.contextInitialized()相同的基本排序)时,我的日志输出如下所示:

代码语言:javascript
复制
INFO : MyController - Registering service foo 0.1.0 at 192.168.34.15:8080
...
May 7, 2012 3:42:49 PM org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080
May 7, 2012 3:42:49 PM org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080

我想看到的是:

代码语言:javascript
复制
INFO: Starting Coyote HTTP/1.1 on http-8080
...
INFO : MyController - Registering service foo 0.1.0 at 192.168.34.15:8080
...
EN

回答 2

Stack Overflow用户

发布于 2012-05-07 15:32:09

您要寻找的侦听器是javax.servlet.ServletContextListener及其contextInitialized(..)方法(并将其注册到web.xml中的<listener><listener-class>..@WebListener中)

如果您需要一个spring,您可以使用:

代码语言:javascript
复制
WebApplicationContextUtils.getRequiredWebApplicationContext(ctx).getBean(..);
票数 3
EN

Stack Overflow用户

发布于 2012-05-07 15:39:38

我的第一个猜测是,您应该查看javax.servlet.ServletContextListener,但我不确定这是否会对您有所帮助,因为Spring通常是在这样的侦听器中初始化的。请检查您的web.xml中是否有如下一行:

代码语言:javascript
复制
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

如果存在这种情况,那么ApplicationContext将在上下文创建后立即创建(理论上,应用程序此时可以处理请求,但实际上,您正处于最后的配置阶段)。

所以问题是你想要实现什么。如果您想为每个请求创建一个新bean,请使用“请求”范围。

如果您只想延迟bean的创建,那么您应该给出一个这样做的技术理由。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10484186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档