Web容器启动后执行代码的几种方式,其执行顺序为:4===>5===>1===>2===>3,即指定init-method的Bean开始执行,接着实现spring的Bean后置处理器开始执行,然后是Servlet的监听器执行,再接下来是Servlet的过滤器执行,最后才是Servlet执行。

1.实现Servlet监听器接口ServletContextListener

public class InitListener implements ServletContextListener {  

    @Override
public void contextDestroyed(ServletContextEvent context) { } @Override
public void contextInitialized(ServletContextEvent context) {
// 上下文初始化执行
System.out.println("================>[ServletContextListener]自动加载启动开始.");
SpringUtil.getInstance().setContext(WebApplicationContextUtils.getWebApplicationContext(arg0.getServletContext()));
}
}

然后在web.xml文件配置该监听器

<listener>
<listener-class>com.test.init.InitListener</listener-class>
</listener>

2.实现Servlet的过滤器Filter

public class InitFilter implements Filter {  

    @Override
public void destroy() { } @Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException,
ServletException { } @Override
public void init(FilterConfig config) throws ServletException {
System.out.println("================>[Filter]自动加载启动开始.");
// 读取Spring容器中的Bean[此时Bean已加载,可以使用]
//写启动需要执行的代码
System.out.println("================>[Filter]自动加载启动结束.");
}
}

然后在web.xml文件配置过滤器即可

<filter>
<filter-name>InitFilter</filter-name>
<filter-class>com.test.init.InitFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>InitFilter</filter-name>
<url-pattern>/</url-pattern>
</filter-mapping>

3.编写一个Servlet,在web.xml里面配置容器启动后执行即可

public class InitServlet extends HttpServlet {  

    /**
*/
private static final long serialVersionUID = 1L; @Override
public void init(ServletConfig config) {
try {
super.init();
} catch (ServletException e) {
e.printStackTrace();
}
System.out.println("================>[Servlet]自动加载启动开始.");
// 读取Spring容器中的Bean[此时Bean已加载,可以使用]
//执行想要的代码
System.out.println("================>[Servlet]自动加载启动结束.");
}
}

然后在web.xml文件配置该Servlet的启动方式为:容器启动后执行

<servlet>
<servlet-name>InitServlet</servlet-name>
<servlet-class>com.test.init.InitServlet</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>test</param-value>
</init-param>
<!-- 此处指定加载顺序为2,表明还有优先级更高的Servlet要先执行 -->
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>InitServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

关于启动后执行,由load-on-startup指定:

(1)当值为0或者大于0时,表示容器在应用启动时就加载这个servlet。值越小,启动优先级越高; 
(2)当是一个负数时或者没有指定时,表示该servlet被调用时才加载。

4.如果你使用Spring IOC作为Bean管理容器,那么可以指定init-method其中init-method表示bean加载成功后,立即执行某个方法

配置如下:start为要执行的方法名称

<!-- service -->
<bean id="shopService" class="com.test.teach.service.ShopService" init-method="start">
<property name="shopDao" ref="shopDao" />
</bean>

5.如果你使用Spring IOC作为Bean管理容器,还可以实现Spring的Bean后置处理器接口
        BeanFactoryPostProcessor表示:该Bean加载完成之后,Spring可以让开发者自定义一些事件。

public class KeyWordInit implements BeanFactoryPostProcessor {  

    @Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory factory) throws BeansException {
System.out.println("================>[BeanFactoryPostProcessor]自动加载启动开始.");
ShopService shopService = factory.getBean("shopService", ShopService.class);
List<Map<String, Object>> shopList = shopService.findAllShop();
System.out.println("================>" + shopList);
System.out.println("================>[BeanFactoryPostProcessor]自动加载启动结束.");
}
} 转自https://www.cnblogs.com/flyingeagle/articles/6681427.html

java Web 启动时自动执行代码的几种方式的更多相关文章

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

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

  2. web项目启动时,自动执行代码的几种方式

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

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

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

  4. tomcat启动时自动运行代码

    原文链接:http://jingpin.jikexueyuan.com/article/49660.html 作者: 一直向北 发布时间:2015-07-13 11:12:13 方法1:tomcat ...

  5. 让docker中的mysql启动时自动执行sql文件

    本文提要 本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动MySQL服务接受外部连接,主要是通过Docker ...

  6. docker 生成mysql镜像启动时自动执行sql

    文章转载自:https://www.jianshu.com/p/12fc253fa37d 在docker 创建 mysql 容器时,往往需要在创建容器的过程中创建database 实例,代码如下: # ...

  7. 让docker中的mysql启动时自动执行sql

    在用docker创建mysql容器的时,有时候我们期望容器启动后数据库和表已经自动建好,初始化数据也已自动录入,也就是说容器启动后我们就能直接连上容器中的数据库,使用其中的数据了. 其实mysql的官 ...

  8. 在java项目启动时就执行某操作

    在java启动时大概有四种,此处只介绍3种 1.在启动的方法上使用通过@PostConstruct方法实现初始化bean进行操作 2.通过bean实现InitializingBean接口 @Overr ...

  9. 一张图帮你记忆,Spring Boot 应用在启动阶段执行代码的几种方式

    前言 有时候我们需要在应用启动时执行一些代码片段,这些片段可能是仅仅是为了记录 log,也可能是在启动时检查与安装证书 ,诸如上述业务要求我们可能会经常碰到 Spring Boot 提供了至少 5 种 ...

随机推荐

  1. 2013年第四届蓝桥杯C/C++B组省赛题目解析

    一. 高斯日记 大数学家高斯有个好习惯:无论如何都要记日记. 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们知道,那个整数就是日期,它表示那一天是高斯出生后 ...

  2. 第三百七十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapyd部署scrapy项目

    第三百七十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapyd部署scrapy项目 scrapyd模块是专门用于部署scrapy项目的,可以部署和管理scrapy项目 下载地址:h ...

  3. Java如何显示小时和分钟?

    在Java中,如何显示小时和分钟(当前时间)? 此示例演示如何使用Calender类的Calender.getInstance()来显示某个时刻的小时和分钟. package com.yiibai; ...

  4. Java如何格式化AM-PM格式的时间?

    在JAVA中,如何格式化AM-PM格式的时间? 该示例使用SimpleDateFormat(“HH-mm-ss a”)构造函数和SimpleDateFormat类的sdf.format(date)方法 ...

  5. com.ibm.msg.client.jms.DetailedJMSSecurityException: JMSWMQ2013: 为队列管理器提供的安全性认证无效

    com.ibm.msg.client.jms.DetailedJMSSecurityException: JMSWMQ2013: 为队列管理器“zm_queue_manager”提供的安全性认证无效, ...

  6. Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(转)

    Dubbo与Zookeeper.Spring整合使用 Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spri ...

  7. Xcode 文档注释

    首先要下载一个服务:[下载地址]这是一个老外写的工作流,解压缩,然后双击,安装一下, 选择xcode —> services —> services perference 安装完就会在右边 ...

  8. Linux top和负载的解释(转载)

    转载自://www.blogjava.net/freeman1984/archive/2011/12/08/365853.html op命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程 ...

  9. 用好这6个APP,学英语SO EASY!

      http://www.jianshu.com/p/30a27af18340  

  10. text/html和text/plain的区别

    1.text/html的意思是将文件的content-type设置为text/html的形式,浏览器在获取到这种文件时会自动调用html的解析器对文件进行相应的处理. 2.text/plain的意思是 ...