在项目开发过程中,往往需要一些功能随着项目启动而优先启动,下面我总结几种方式(非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. python网络爬虫技术图谱

  2. js的基础知识笔记

    目录 一.基本数据类型 二.函数 三.面向对象 一.基本数据类型 1.使用var声明变量.使用;结尾.使用{}表示代码块.使用驼峰式命名 2.变量是弱类型的,即并不严格要求声明变量的类型,一个变量可以 ...

  3. Java之集合(二十五)ConcurrentHashMap

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7520808.html 1.前言 本章介绍使用的最频繁的并发集合类之一ConcurrentHashMap,之前介绍 ...

  4. java数据结构之递归算法

    概述程序调用自身的编程技巧称为递归( recursion).递归做为一种算法在程序设计语言中广泛应用.递归有直接递归和间接递归•直接递归:函数在执行过程中调用本身.•间接递归:函数在执行过程中调用其它 ...

  5. 视口(viewport)原理详解之第二部分(移动端浏览器)

    一.移动端浏览器的问题 当我们把移动端浏览器和桌面浏览器比较时,最明显的差异就是尺寸.移动端浏览器尺寸要比桌面屏幕小得多,移动浏览器最多差不多也就400px.最重要的问题集中在我们的CSS上,特别是v ...

  6. php的数组变量

    数组就是存储同一类型的多个变量的 一种特殊的类型 php的数组有两种形态 1.普通类型 eg:$cars = array("Volvo","BMW"," ...

  7. URL编码分析与乱码解决方案

    一.问题的由来 URL就是网址,只要上网,就一定会用到. 一般来说,URL只能使用英文字母.阿拉伯数字和某些标点符号,不能使用其他文字和符号.比如,世界上有英文字母的网址"http://ww ...

  8. HTTPS 接入优化建议

      随着网络安全的普及成为共识,部署SSL证书完成HTTPS加密的站点 也随之增多.HTTPS加密能够带来的对身份验证及信息加密等诸多好处,不过想要HTTPS协议发挥更加完美的作用也需要开发者在相应环 ...

  9. Linux多线程 - 基本操作

    0. 线程 vs 进程 何为线程?线程即轻量级进程,如何理解轻量级这个概念? 我们知道,Linux的资源分为用户空间资源和内核空间资源: 用户空间资源:用来存放用户自定义的一些数据,用户可直接控制: ...

  10. Jsp&Servlet入门级项目全程实录第6讲

    惯例广告一发,对于初学真,真的很有用www.java1234.com,去试试吧! 1.建立数据表及数据(略) 2.创建student model package com.java1234.model; ...