我有一个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上下文要完成时,有没有办法运行代码(不仅仅是石英相关)?
答案 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非常善于避免你处理低级问题。
在更高级别,你有:
简单地声明一个新bean,在其中注入所有其他bean,并在最后一个bean的init方法中进行初始化。 Spring保证在初始化所有依赖bean之后,在上下文初始化时调用此方法。
这种方式完全独立于您的应用程序是否是Web应用程序:成为Spring框架的问题而不再是您的问题。