在某些项目中,经常会加载一些资源,或者一起功能类,而这些类要优于所有服务前启动,所以这里举例普通Javaweb,spring框架两种情况下。
普通Javaweb
方式一:监听器
通过在web.xml(资源部署描述符)中,配置
1.建立Java类监听
2.实现ServletContextListener接口并实现
contextInitialized(ServletContextEvent servletContextEvent)和
contextDestroyed(ServletContextEvent servletContextEvent)方法
contextInitialized在应用启动时执行,contextDestroyed在应用退出时执行
代码如下
import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class ContextListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent servletContextEvent) { System.out.println("我优先启动"+ UTIME.getTime()); } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { System.out.println("损坏"+ UTIME.getTime()); } }
在方法中增加了一行输出,并使用自己写的getTime输出当前时间,即方法执行的时间,复制时使用System.currentTimeMillis()方法即可
3.配置web.xml
在web.xml中配置标签,引用上面建立的监听类即可
代码如下:
<listener> <listener-class>com.jiuzhou.ContextListenerlistener-class> listener>运行应用程序即可。
方式二:配置load-on-start标签
1.建立一个普通Java类实现HttpServlet接口或者Servlet接口使其成为一个Servlet
2.实现必要方法(doGet或doPost或Service等),
重载构造器和init方法
代码如图:
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class A extends HttpServlet{ public A(){ System.out.println("hello A" + UTIME.getTime()); } @Override public void init() throws ServletException { super.init(); System.out.println("hello Init"+ UTIME.getTime()); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doGet(req, resp); System.out.println("Hello World"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
除doPost方法调用doGet方法外,每一个方法都分别输出当前时间,并加一些字符串作为区分。
3.配置web.xml
<servlet> <servlet-name>helloservlet-name> <servlet-class>com.test.Aservlet-class> <load-on-startup>0load-on-startup> servlet> <servlet-mapping> <servlet-name>helloservlet-name> <url-pattern>/hellourl-pattern> servlet-mapping>
在正常的servlet配置中加入
注:不要小于0,小于.不会启动。相同时,按顺序启动。
运行程序,会发现这个类也优先启动了。
那么两种谁会优先启动呢?同时执行程序看结果
发现使用
以上两种方法都可以在普通Javaweb下优先启动一个类。
Spring框架中
方式一:通过@PostConstruct方法实现初始化bean进行操作
1.在要执行的方法前面加上@PostConstruct注解
代码如下:
import com.jiuzhou.utils.UTIME; import org.springframework.stereotype.Controller; import javax.annotation.PostConstruct; /** * Created by ASUS on 2018/6/22. */ @Controller public class InitController { public InitController(){ System.out.println("构造器:"+ UTIME.getTime()); } @PostConstruct public void init(){ System.out.println("init:"+ UTIME.getTime()); } }
执行效果如图所示:
该方法在容器运行时被调用。
方式二: init-method方法
1.在xml文件里配置bean,bean的配置中配置init-method方法(该方法配置成你想要执行的操作方法)。
代码如图
<bean id="InitController" class="com.jiuzhou.controller.InitController" init-method="init">bean>
import com.jiuzhou.utils.UTIME; import org.springframework.stereotype.Controller; @Controller public class InitController { public InitController(){ System.out.println("构造器:"+ UTIME.getTime()); } public void init(){ System.out.println("init:"+ UTIME.getTime()); } }
执行效果如图所示:
方式三:实现InitializingBean接口
1.实现InitializingBean接口
2.覆盖aftetPropertiesSet方法
import com.jiuzhou.utils.UTIME; import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Controller; @Controller public class InitController implements InitializingBean { public InitController(){ System.out.println("构造器:"+ UTIME.getTime()); } @Override public void afterPropertiesSet() throws Exception { System.out.println("init:"+ UTIME.getTime()); } }
执行效果如图所示: