以下的3种方法都是在Tomcat启动过程当中执行的,这样会影响Tomcat的启动时间,从而形成Tomcat不能启动成功:
1.配置一个Servlet默认自动启动。
2.配置一个Listener来启动
3.实现spring的InitializingBean接口
要想不影响Tomcat的启动,便联想到了异步调用 。即无非就是新建立了一个线程来单独执行,这样Tomcat执行到相应的操做就能够直接继续下去了,不会处于等待的状态,避免了启动超时。基于这样的思想,能够有两种方法来完成:web
方法一:使用如上三种方式中的任何一种来在启动Tomcat的过程当中执行相应的方法,而后在执行的过程当中使用另外一个线程来执行:好比说将要执行的方法所在的类继承HttpServlet并在web.xml中配置,而后在该Servlet的init中去调用想要执行的方法时(假设这个方法名叫start()),启动另外一个线程来执行,具体代码以下。spring
在servlet 初始化方法中启动要执行的start()方法线程:tomcat
@Override public void init() throws ServletException { FutureTask<String> task = new FutureTask<String>(new Callable<String>(){ @Override public String call() throws Exception { start(); return "Collection Completed"; } }); new Thread(task).start(); }
start()方法: app
private void start() { QualityTestUtil qualityTestUtil=SpringUtil.getBean("QualityTestUtil"); System.out.println("spring 装配了"); qualityTestUtil.test(); }
spring工具类获取spring上下文:异步
public class SpringUtil implements ApplicationContextAware { private static ApplicationContext applicationContext; // Spring应用上下文环境 /* * 实现了ApplicationContextAware 接口,必须实现该方法; *经过传递applicationContext参数初始化成员变量applicationContext */ public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { System.out.println("===================setApplicationContext"); SpringUtil.applicationContext = applicationContext; } public static ApplicationContext getApplicationContext() { return applicationContext; } @SuppressWarnings("unchecked") public static <T> T getBean(String name) throws BeansException { return (T) applicationContext.getBean(name); } }
tomcat 中配置serlvet:ide
<servlet> <description></description> <display-name>ServletUtil</display-name> <servlet-name>ServletUtil</servlet-name> <servlet-class>com.htjf.util.ServletUtil</servlet-class> <load-on-startup>3</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ServletUtil</servlet-name> <url-pattern>/ServletUtil</url-pattern> </servlet-mapping>
那么 你的类将被spring 装配 而且启动start方法 可是不影响tomcat启动工具