web项目启动时,自动执行代码的几种方式
在项目开发过程中,往往需要一些功能随着项目启动而优先启动,下面我总结几种方式(非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项目启动时,自动执行代码的几种方式的更多相关文章
- java Web 启动时自动执行代码的几种方式
Web容器启动后执行代码的几种方式,其执行顺序为:4===>5===>1===>2===>3,即指定init-method的Bean开始执行,接着实现spring的Bean后置 ...
- 在web项目启动时,执行某个方法
在web项目中有很多时候需要在项目启动时就执行一些方法,而且只需要执行一次,比如:加载解析自定义的配置文件.初始化数据库信息等等,在项目启动时就直接执行一些方法,可以减少很多繁琐的操作. 在工作中遇到 ...
- SAS启动时自动执行代码
有时候我们希望SAS启动时自动执行已经编写好的程序,可以按照以下方法实现: 首先正常打开SAS,编写我们想要让SAS启动时自动执行的代码,例如获取桌面文件夹路径,以便在其他程序中引用这个路径. pro ...
- java web项目启动时自动加载自定义properties文件
首先创建一个类 public class ContextInitListener implements ServletContextListener 使得该类成为一个监听器.用于监听整个容器生命周期的 ...
- 在web项目启动时,使用监听器来执行某个方法
在web项目中有很多时候需要在项目启动时就执行一些方法,而且只需要执行一次,比如:加载解析自定义的配置文件.初始化数据库信息等等,在项目启动时就直接执行一些方法,可以减少很多繁琐的操作. 这里写了个简 ...
- 在web项目启动时执行某个方法
在web项目中有很多时候需要在项目启动时就执行一些方法,而且只需要执行一次,比如:加载解析自定义的配置文件.初始化数据库信息等等,在项目启动时就直接执行一些方法,可以减少很多繁琐的操作. 在工作中遇到 ...
- 转载:如何让spring mvc web应用启动时就执行
转载:如何让spring mvc web应用启动时就执行特定处理 http://www.cnblogs.com/yjmyzz/p/4747251.html# Spring-MVC的应用中 一.Appl ...
- spring mvc web应用启动时就执行特定处理(线程启动)
package com.sdt.platform.index.controller; import java.net.URL; import java.util.List; import java.u ...
- 详解如何在 Linux 启动时自动执行命令或脚本
我一直很好奇,在启动 Linux 系统并登录的过程中到底发生了什么事情.按下开机键或启动一个虚拟机,你就启动了一系列事件,之后会进入到一个功能完备的系统中,有时,这个过程不到一分钟.当你注销或者关机时 ...
随机推荐
- Netty核心概念(6)之Handler
1.前言 本节介绍Netty中第三个重要的概念——Handler,这个在前两节都提到了,尤其是Channel和Handler联系紧密.handler本身的设计非常简单,但是所起到的作用却很大,Nett ...
- Android Library项目发布到JCenter最简单的配置方法
前沿 网上的步骤看起来实在太麻烦,gituhb上偶然间看到的一个项目,经过实际验证确实可行.github连接:https://github.com/xiaopansky/android-library ...
- HUE配置文件hue.ini 的database模块详解(包含qlite、mysql、 psql、和oracle)(图文详解)(分HA集群和非HA集群)
不多说,直接上干货! Hue配置文件里,提及到,提供有postgresql_psycopg2, mysql, sqlite3 or oracle. 注意:Hue本身用到的是sqlite3. 在哪里呢, ...
- OpenGL12-shader(GLSL)着色语言2-(参数传递)(代码以上传)
上一篇中介绍了如何使用shader,用来一个最简单的shader,计算顶点的位置,调用了 OpenGL 顶点着色语言中的内置变量对顶点进行操作,这一例程中,将展示如何将应用层 的数据传递到shader ...
- 机器学习中规范化项:L1和L2
规范化(Regularization) 机器学习中几乎都可以看到损失函数后面会添加一个额外项,常用的额外项一般有两种,一般英文称作ℓ1-norm和ℓ2-norm,中文称作L1正则化和L2正则化,或者L ...
- Joda-Time 学习笔记
一 Jode-Time 介绍 任何企业应用程序都需要处理时间问题.应用程序需要知道当前的时间点和下一个时间点,有时它们还必须计算这两个时间点之间的路径.使用 JDK 完成这项任务将非常痛苦和繁琐.既然 ...
- haproxy配置文件详解--转
原始出处:http://itnihao.blog.51cto.com/1741976/915537 #/usr/local/sbin/haproxy -f /etc/haproxy/haproxy.c ...
- 设置input标签placeholder字体颜色
有时会遇到这样的需求,输入框的默认提示文字与用户输入的文字不同. <input className="city" placeholder="城市"/> ...
- HTML5的新结构标签
在之前的HTML页面中,大家基本上都是用了Div+CSS的布局方式.而搜索引擎去抓取页面的内容的时候,它只能猜测你的某个Div内的内容是文章内容容器,或者是导航模块的容器,或者是作者介绍的容器等等.也 ...
- BG.Hadoop.Master
1. 安装JDK JDK安装包复制到/opt文件夹 cd /opt rpm -ivh jdk-8u121-linux-x64.rpm vim /etc/profile 增加 JAVA_HOME=/us ...
