在项目开发过程中,往往需要一些功能随着项目启动而优先启动,下面我总结几种方式(非spring boot) spring boot的参考 spring boot 学习之路9 (项目启动后就执行特定方法)


方式一:   ServletContextListener监听器,不懂监听器的可以去网上百度一下servlet的监听器

  

java 代码如下:

package com.deifeng.huhy.common.run; import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class RunStartOne implements ServletContextListener {
private static final Logger LOGGER = LoggerFactory.getLogger(RunStartOne.class);
public RunStartOne() {}
public void contextDestroyed(ServletContextEvent arg0) {}
public void contextInitialized(ServletContextEvent arg0) {
try {
// 需要实现的功能
System.out.println("随项目启动方式一----------------》");
} catch (Exception e) {
LOGGER.error("GreyClientInitListener error", e);
}
}
} web.xml配置如下:
  <listener><listener-class>com.deifeng.huhy.common.run.RunStartOne</listener-class></listener>
项目启动如下:
  


方式二:  ApplicationListener

  

代码实现如下:
package com.deifeng.huhy.common.run; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Service; @Service
public class RunStartTwo implements ApplicationListener<ContextRefreshedEvent> {
private static final Log LOGGER = LogFactory.getLog(RunStartTwo.class);
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
try {
// 在web项目中(spring mvc),系统会存在两个容器,一个是root application context
// ,另一个就是我们自己的 projectName-servlet context(作为root application context的子容器)。
// 这种情况下,就会造成onApplicationEvent方法被执行两次。为了避免这个问题,我们可以只在root
// application context初始化完成后调用逻辑代码,其他的容器的初始化完成,则不做任何处理。
if (event.getApplicationContext().getParent() == null) {
// 需要实现的功能
System.out.println("随项目启动方式二----------------》");
}
} catch (Exception e) {
LOGGER.error("StartGateServiceData", e);
}
}
} 启动成功如下:
  
 

方式三:extends HttpServlet

  

代码实现:
public class RunStartThree extends HttpServlet {
// Servlet的init方法会在Tomcat启动的时候执行
public void init() throws ServletException {
// 需要实现的功能
System.out.println("随项目启动方式三--------------》");
}
} web.xml的配置:
<servlet>
   <servlet-name>init</servlet-name>
   <servlet-class>com.deifeng.huhy.common.run.RunStartThree</servlet-class>
   <load-on-startup></load-on-startup>
</servlet>
注意: 有人会问为啥不配servlet-map 简单解释一下,这个功能是随着项目启动而启动,我不允许有url能访问到,所以在这就没配置,如果你配上也没问题,不会保错,为了代码的安全性,我就不配做url的映射了 启动项目成功如图:
  



到这,还没结束,不知道有没有人会思考,这三种启动方式有没有先后啊:现在代码都有了,我就在这测一下------------------------------------

  现在我把三种方式都放开:启动项目我们看日志记录就行了

  applicaton      >       listener    > httpServlet

  

  分析:

    这个优先顺序和servlet容器有关,如果你研读过servlet的源码,

    1.web项目中(spring mvc),系统会存在两个容器,一个是root application context。另一个就是我们自己的 projectName-servlet context(作为root application context的子容器)。这种情况下,就会造成onApplicationEvent方法被执行两次。为了避免这个问题,我们可以只在root application context初始化完成后调用逻辑代码,其他的容器的初始化完成,则不做任何处理。【对应于方式二】

    2.系统容器,是root在先  然后就是项目容器,对于servelt的加载顺序   监听器》过滤器 》servlet  的加载机制,所以造成上面那张启动顺序,有时间可以看看servlet源码

    

 

web项目启动时,自动执行代码的几种方式的更多相关文章

  1. java Web 启动时自动执行代码的几种方式

    Web容器启动后执行代码的几种方式,其执行顺序为:4===>5===>1===>2===>3,即指定init-method的Bean开始执行,接着实现spring的Bean后置 ...

  2. 在web项目启动时,执行某个方法

    在web项目中有很多时候需要在项目启动时就执行一些方法,而且只需要执行一次,比如:加载解析自定义的配置文件.初始化数据库信息等等,在项目启动时就直接执行一些方法,可以减少很多繁琐的操作. 在工作中遇到 ...

  3. SAS启动时自动执行代码

    有时候我们希望SAS启动时自动执行已经编写好的程序,可以按照以下方法实现: 首先正常打开SAS,编写我们想要让SAS启动时自动执行的代码,例如获取桌面文件夹路径,以便在其他程序中引用这个路径. pro ...

  4. java web项目启动时自动加载自定义properties文件

    首先创建一个类 public class ContextInitListener implements ServletContextListener 使得该类成为一个监听器.用于监听整个容器生命周期的 ...

  5. 在web项目启动时,使用监听器来执行某个方法

    在web项目中有很多时候需要在项目启动时就执行一些方法,而且只需要执行一次,比如:加载解析自定义的配置文件.初始化数据库信息等等,在项目启动时就直接执行一些方法,可以减少很多繁琐的操作. 这里写了个简 ...

  6. 在web项目启动时执行某个方法

    在web项目中有很多时候需要在项目启动时就执行一些方法,而且只需要执行一次,比如:加载解析自定义的配置文件.初始化数据库信息等等,在项目启动时就直接执行一些方法,可以减少很多繁琐的操作. 在工作中遇到 ...

  7. 转载:如何让spring mvc web应用启动时就执行

    转载:如何让spring mvc web应用启动时就执行特定处理 http://www.cnblogs.com/yjmyzz/p/4747251.html# Spring-MVC的应用中 一.Appl ...

  8. spring mvc web应用启动时就执行特定处理(线程启动)

    package com.sdt.platform.index.controller; import java.net.URL; import java.util.List; import java.u ...

  9. 详解如何在 Linux 启动时自动执行命令或脚本

    我一直很好奇,在启动 Linux 系统并登录的过程中到底发生了什么事情.按下开机键或启动一个虚拟机,你就启动了一系列事件,之后会进入到一个功能完备的系统中,有时,这个过程不到一分钟.当你注销或者关机时 ...

随机推荐

  1. SpringMVC3.2+Spring3.2+Mybatis3.1(SSM~Demo)

    SpringMVC+Spring+Mybatis 框架搭建 整个Demo的视图结构: JAR: 下载地址:http://download.csdn.net/detail/li1669852599/85 ...

  2. rails中 flash 和 flash.now的区别

    Flash[:notice]’s message will persist to the next action and should be used when redirecting to anot ...

  3. Android RecyclerView的使用

    RecyclerView是什么? RecyclerView是一种新的视图组件,目标是为任何基于适配器的视图提供相似的渲染方式.它被作为ListView和GridView控件的继承者,在最新的suppo ...

  4. JavacProcessingEnvironment类解读

    JavacProcessingEnvironment类的继承体系如下: 其中含有很多内部类,最重要的是迭代注解处理器相关的类,如下:

  5. #define a int[10]与 typedef int a[10]用法

    // #define a int[10] #include <stdio.h> #include <stdlib.h> #define a int[10] int main() ...

  6. docker 创建基础镜像

    docker 安装卸妆官方说明:  https://docs.docker.com/install/linux/docker-ee/centos/#os-requirements 本系列基于cento ...

  7. 进击Node.js基础(二)

    一.一个牛逼闪闪的知识点Promise npm install bluebird 二.Promise实例 ball.html <!doctype> <!DOCTYPE html> ...

  8. Beta阶段——Scrum 冲刺博客第四天

    一.当天站立式会议照片一张 二.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中 昨天已完成的工作 完成对question界面的制作,完善随机出题界面,能够流畅的切换下一题与 ...

  9. JavaScript文档对象模型

    文档对象模型(Document Object Model, DOM)是W3C提出的用于访问和修改文档的接口. JavaScript设计的初衷是为Web提供交互功能,它通过DOM接口来访问和修改文档. ...

  10. Winform开发全套31个UI组件开源共享

    一.前言 这套UI库是上一个公司(好几年前了)完成的.当时主要为开发公司内部ERP系统,重新设计实现了所有用到的Winform组建,包括Form窗体组建6个(支持换肤),基础控件25个.其中有很多参考 ...