gpt4 book ai didi

java - 在部署在 Tomcat 上的 Web 应用程序中初始化 Spring 上下文后运行代码

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:22:01 25 4
gpt4 key购买 nike

我有一个 web 应用程序,我将其打包为 war 并部署在 tomcat 7 上。

这是一个 Spring MVC 应用程序,我想向它添加一个 Quartz 调度程序。我想运行将使用各种 Spring bean 的代码,并使用动态配置的作业填充调度程序,因此我需要访问代码中的各种 Bean,例如

 @Autowired
private CronDAO cronDAO;

public void loadCronJobs(final Scheduler scheduler) {
LOGGER.info("Vas[{}]: Loading Cron Schedule...", vasName);
final List<Cron> crons = cronDAO.fetchAll();
final Long cronSid = cron.getSid();
final String directive = cron.getDirective();
final String expression = cron.getCronExpression();
...
}

通常我会将调度程序的初始化代码放在应用程序的主要函数中,并为我的应用程序逻辑使用 Autowiring bean。现在随着应用程序服务器初始化应用程序,我不能这样做。

我试图将我的代码添加到 servlet 的启动函数,但 Spring 上下文尚未准备就绪,因此 Autowiring 的 bean(本例中的 DAO)无法加载。

public class MyWebAppInitializer implements WebApplicationInitializer {

@Override
public void onStartup(ServletContext container) throws ServletException {
CronManager cron = new CronManagerImpl();
cron.loadCronJobs();
}
}

有没有办法在应用程序在容器中启动但 Spring 上下文完成时运行代码(不仅与 quartz 相关)?

最佳答案

您可以编写一个“ServletContextListener”并将其注册到 web.xml 中。在您的实现中,您可以依赖 spring 框架 WebApplicationContextUtil 来获取 spring 应用程序上下文的句柄。

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.springframework.web.context.support.WebApplicationContextUtils;

public class QuartzInitiator implements ServletContextListener {

public void contextInitialized(ServletContextEvent servletContextEvent) {
WebApplicationContextUtils.getRequiredWebApplicationContext(servletContextEvent.getServletContext())
.getAutowireCapableBeanFactory().autowireBean(this);
//your logic
}
}

Autowired 字段将由 Util 正确初始化。

关于java - 在部署在 Tomcat 上的 Web 应用程序中初始化 Spring 上下文后运行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27721730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com