正常情况下,如果我们在web.xml配置文件中配置了监听
他们的执行顺序是:先加载监听器,然后在初始化spring容器
现在我想在监听器中使用spring的初始化内容
使用了一种变通的方法,如下:
在使用需要的service实现类的时候,先初始化:
做法如下:
在ApplicationContext.xml文件中加入:
<bean id="userServiceImp" class="cn.zz.lc.service.imp.UserServiceImp"></bean>
UserServiceImp是我的service层的实现类;
在web.xml文件中加入监听配置:
<listener>
<listener-class>cn.zz.lc.listener.SubmitListener</listener-class>
</listener>
cn.zz.lc.listener.SubmitListener是我的监听类:
package cn.zz.lc.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import cn.zz.lc.service.imp.UserServiceImp;
import cn.zz.lc.util.Constant;
import cn.zz.lc.util.ThreadSubmit;
public class SubmitListener implements ServletContextListener {
private ThreadSubmit ts;
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("数据提交,监听中断");
if (ts != null && ts.isInterrupted()) {
ts.interrupt();
}
}
@Override
public void contextInitialized(ServletContextEvent contextEvent) {
try {
ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(contextEvent
.getServletContext());
UserServiceImp userService = (UserServiceImp) context.getBean("userServiceImp");
System.out.println("数据提交,监听开始");
if (ts == null) {
ts = new ThreadSubmit(Constant.queue, userService);
ts.start();
} else {
ts.start();
}
} catch (Exception e) {
System.out.println("系统无法初始化,异常退出");
System.out.println(e);
}
}
}