关于Javaweb和使用框架优先启动一个类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38668663/article/details/80771955

在某些项目中,经常会加载一些资源,或者一起功能类,而这些类要优于所有服务前启动,所以这里举例普通Javaweb,spring框架两种情况下。

普通Javaweb

方式一:监听器

通过在web.xml(资源部署描述符)中,配置<listener>标签。

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>
    <listener-class>com.jiuzhou.ContextListener</listener-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>hello</servlet-name>
    <servlet-class>com.test.A</servlet-class>
    <load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

在正常的servlet配置中加入<load-on-startup>标签即可。tomcat启动时会按照配置了<load-on-start-up>标签的顺序启动,数值越小,越先启动。

注:不要小于0,小于.不会启动。相同时,按顺序启动。

运行程序,会发现这个类也优先启动了。


那么两种谁会优先启动呢?同时执行程序看结果

发现使用<listener>标签配置的优先执行,通过load-on-start启动的随后执行。

以上两种方法都可以在普通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());
    }
}

执行效果如图所示:



猜你喜欢

转载自blog.csdn.net/qq_38668663/article/details/80771955