在项目开发过程中,往往需要一些功能随着项目启动而优先启动,下面我总结几种方式(非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. Intellij-怎么避免import.*包,以及import包顺序问题

    Intellij版本 IntelliJ IDEA 2018.1.2 (Ultimate Edition) Build #IU-181.4668.68, built on April 24, 2018 ...

  2. 友盟在部分手机上在进程被kill的情况下接收不到推送的问题

    app集成友盟推送后就能接收推送消息,即使在进程被kill的情况下也能接收.这个因为友盟有长连互保,用户设备中任何一个集成过友盟推送的app打开,即使他的app没打开也能启动push service, ...

  3. Android 开发工具类 31_WebService 获取手机号码归属地

    AndroidInteractWithWebService.xml <?xml version="1.0" encoding="utf-8"?> & ...

  4. xgboost与gbdt区别

    1.基分类器的选择:传统GBDT以CART作为基分类器,XGBoost还支持线性分类器,这个时候XGBoost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题). 2.二阶泰 ...

  5. PHP操作MySQL数据库步骤:

    简单的PHP操作数据库步骤: 1.连接数据库     $con = mysql_connect('ip','username','password'); 2.选择数据库   mysql_select_ ...

  6. Nodejs学习笔记(四)—与MySQL交互(felixge/node-mysql)

    简介和安装 Node.js与MySQL交互操作有很多库,具体可以在 https://www.npmjs.org/search?q=mysql  查看. 我选择了felixge/node-mysql,用 ...

  7. linux svn 自启动

    .svn服务自启动脚本 把脚本放在/etc/init.d/下 vi /etc/rc.d/init.d/svn svn脚本内容: #!/bin/bash # chkconfig: - # descrip ...

  8. SC Create 创建一个Windows系统服务 转

        转自:http://www.360doc.com/content/13/0428/09/7555793_281451268.shtml sc create Serv-U binpath= &q ...

  9. rails中params[:id]与params["id"]分析

    写这个帖子的缘由是因为在页面参数传到rails的controller时用params[:]和params[""]都可以取到值: [1] pry(#<BooksControll ...

  10. mysql备份与恢复数据

    先备份数据库使用 mysqldump -u root -plvtao 数据库 > /home/bak.sql再把备份的数据库还原就可以了导入数据库 常用source 命令 进入mysql数据库控 ...