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

时间:2014-12-31 13:18:49

标签: java spring spring-mvc tomcat quartz-scheduler

我有一个Web应用程序,我打包作为战争,我部署在tomcat 7上。

这是一个Spring MVC应用程序,我想为它添加一个Quartz调度程序。我想运行将使用各种Spring bean的代码,并使用动态配置的Jobs填充调度程序,以便我需要访问代码中的各种Beans,如

 @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();
    ...
 }

通常我会将调度程序的初始化代码放在应用程序的main函数中,并将Autowired bean用于我的应用程序逻辑。现在,随着应用程序服务器初始化应用程序,我无法做到这一点。

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

public class MyWebAppInitializer implements WebApplicationInitializer {

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

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

2 个答案:

答案 0 :(得分:2)

你可以写一个&#39; ServletContextListener&#39;并在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
     }
}

Util将正确初始化自动装配的字段。

答案 1 :(得分:0)

Spring非常善于避免你处理低级问题。

在更高级别,你有:

  • 在Spring应用程序上下文中声明的许多bean
  • 必须运行的初始化过程
      豆子初始化后
    • 在运行其余代码之前

简单地声明一个新bean,在其中注入所有其他bean,并在最后一个bean的init方法中进行初始化。 Spring保证在初始化所有依赖bean之后,在上下文初始化时调用此方法。

这种方式完全独立于您的应用程序是否是Web应用程序:成为Spring框架的问题而不再是您的问题。