如何让springmvc在启动的时候执行特定的业务处理

java 的 web服务器启动时,经常会做一些特定的业务逻辑处理,比如数据库初始化,

初始化系统参数,读取配置文库等。

很多web服务的中间件,可以 通过这样的思路去实现。比如消息分发服务。

实现方法:

一、Web项目,非Spring

解决方法:实现【 ServletContextListener】 接口

(1)、把实现了ServletContextListener 的类配置到【 web.xml】 文件中

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  6. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  7. <display-name></display-name>
  8. <welcome-file-list>
  9. <welcome-file>index.jsp</welcome-file>
  10. </welcome-file-list>
  11. <listener>
  12. <listener-class>com.chinaso.init.StartInit</listener-class>
  13. </listener>
  14. <filter>
  15. <filter-name>struts2</filter-name>
  16. <filter-class>
  17. org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  18. </filter-class>
  19. </filter>
  20. <filter-mapping>
  21. <filter-name>struts2</filter-name>
  22. <url-pattern>/*</url-pattern>
  23. </filter-mapping>
  24. </web-app>
    <?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<listener>
<listener-class>com.chinaso.init.StartInit</listener-class>
</listener>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

(2)、加入自己的实现逻辑

  1. public class StartInit implements ServletContextListener {
  2. static final Logger logger = LoggerFactory.getLogger(StartInit.class);
  3. // 系统初始化执行方法
  4. public void contextDestroyed(ServletContextEvent e) {
  5. logger.info("系统停止...");
  6. }
  7. public void contextInitialized(ServletContextEvent e) {
  8. logger.info("系统初始化开始...");
  9. // 获取项目根目录
  10. String root_path  = e.getServletContext().getRealPath("/");
  11. logger.info("application path : {}",root_path);
  12. // 初始化 ConfigFactorty
  13. ConfigFactory.init(root_path);
  14. // 初始化数据链接信息
  15. DBManager.init();
  16. // 初始化定时统计任务
  17. TaskManager.init();
  18. // 初始化用户信息查询位置
  19. UserInfo.init();
  20. logger.info("系统初始化结束...");
  21. }
  22. }
    public class StartInit implements ServletContextListener {
static final Logger logger = LoggerFactory.getLogger(StartInit.class);
// 系统初始化执行方法
public void contextDestroyed(ServletContextEvent e) {
logger.info("系统停止...");
} public void contextInitialized(ServletContextEvent e) {
logger.info("系统初始化开始..."); // 获取项目根目录
String root_path = e.getServletContext().getRealPath("/");
logger.info("application path : {}",root_path); // 初始化 ConfigFactorty
ConfigFactory.init(root_path);
// 初始化数据链接信息
DBManager.init();
// 初始化定时统计任务
TaskManager.init();
// 初始化用户信息查询位置
UserInfo.init(); logger.info("系统初始化结束...");
} }

二、Spring项目

Spring-MVC的应用中,要实现类似的功能,主要是通过实现下面这些接口(任选一,至少一个即可)

1、ApplicationContextAware接口

  1. package org.springframework.context;
  2. import org.springframework.beans.BeansException;
  3. import org.springframework.beans.factory.Aware;
  4. import org.springframework.context.ApplicationContext;
  5. public interface ApplicationContextAware extends Aware {
  6. void setApplicationContext(ApplicationContext var1) throws BeansException;
  7. }
package org.springframework.context;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.Aware;
import org.springframework.context.ApplicationContext; public interface ApplicationContextAware extends Aware {
void setApplicationContext(ApplicationContext var1) throws BeansException;
}

2、ServletContextAware 接口

  1. package org.springframework.web.context;
  2. import javax.servlet.ServletContext;
  3. import org.springframework.beans.factory.Aware;
  4. public interface ServletContextAware extends Aware {
  5. void setServletContext(ServletContext var1);
  6. }
package org.springframework.web.context;

import javax.servlet.ServletContext;
import org.springframework.beans.factory.Aware; public interface ServletContextAware extends Aware {
void setServletContext(ServletContext var1);
}

3、InitializingBean 接口

  1. package org.springframework.beans.factory;
  2. public interface InitializingBean {
  3. void afterPropertiesSet() throws Exception;
  4. }
package org.springframework.beans.factory;

public interface InitializingBean {
void afterPropertiesSet() throws Exception;
}

4、ApplicationListener<ApplicationEvent> 接口

  1. package org.springframework.context;
  2. import java.util.EventListener;
  3. import org.springframework.context.ApplicationEvent;
  4. public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
  5. void onApplicationEvent(E var1);
  6. }
package org.springframework.context;

import java.util.EventListener;
import org.springframework.context.ApplicationEvent; public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
void onApplicationEvent(E var1);
}

java代码:

  1. package test.web.listener;
  2. import org.apache.logging.log4j.*;
  3. import org.springframework.beans.*;
  4. import org.springframework.beans.factory.InitializingBean;
  5. import org.springframework.context.*;
  6. import org.springframework.context.event.ContextRefreshedEvent;
  7. import org.springframework.stereotype.Component;
  8. import org.springframework.web.context.ServletContextAware;
  9. import javax.servlet.ServletContext;
  10. @Component
  11. public class StartupListener implements ApplicationContextAware, ServletContextAware,
  12. InitializingBean, ApplicationListener<ContextRefreshedEvent> {
  13. protected Logger logger = LogManager.getLogger();
  14. @Override
  15. public void setApplicationContext(ApplicationContext ctx) throws BeansException {
  16. logger.info("1 => StartupListener.setApplicationContext");
  17. }
  18. @Override
  19. public void setServletContext(ServletContext context) {
  20. logger.info("2 => StartupListener.setServletContext");
  21. }
  22. @Override
  23. public void afterPropertiesSet() throws Exception {
  24. logger.info("3 => StartupListener.afterPropertiesSet");
  25. }
  26. @Override
  27. public void onApplicationEvent(ContextRefreshedEvent evt) {
  28. logger.info("4.1 => MyApplicationListener.onApplicationEvent");
  29. if (evt.getApplicationContext().getParent() == null) {
  30. logger.info("4.2 => MyApplicationListener.onApplicationEvent");
  31. }
  32. }
  33. }
package test.web.listener;

import org.apache.logging.log4j.*;
import org.springframework.beans.*;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.*;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;
import org.springframework.web.context.ServletContextAware;
import javax.servlet.ServletContext; @Component
public class StartupListener implements ApplicationContextAware, ServletContextAware,
InitializingBean, ApplicationListener<ContextRefreshedEvent> { protected Logger logger = LogManager.getLogger(); @Override
public void setApplicationContext(ApplicationContext ctx) throws BeansException {
logger.info("1 => StartupListener.setApplicationContext");
} @Override
public void setServletContext(ServletContext context) {
logger.info("2 => StartupListener.setServletContext");
} @Override
public void afterPropertiesSet() throws Exception {
logger.info("3 => StartupListener.afterPropertiesSet");
} @Override
public void onApplicationEvent(ContextRefreshedEvent evt) {
logger.info("4.1 => MyApplicationListener.onApplicationEvent");
if (evt.getApplicationContext().getParent() == null) {
logger.info("4.2 => MyApplicationListener.onApplicationEvent");
}
} }

运行时,输出的顺序如下:

1 => StartupListener.setApplicationContext
2 => StartupListener.setServletContext
3 => StartupListener.afterPropertiesSet
4.1 => MyApplicationListener.onApplicationEvent
4.2 => MyApplicationListener.onApplicationEvent
4.1 => MyApplicationListener.onApplicationEvent

注意:onApplicationEvent方法会触发多次,初始化这种事情,越早越好,建议在setApplicationContext方法中处理。

 

如何让springmvc在启动的时候执行特定的业务处理的更多相关文章

  1. springboot 学习之路 9 (项目启动后就执行特定方法)

    目录:[持续更新.....] spring 部分常用注解 spring boot 学习之路1(简单入门) spring boot 学习之路2(注解介绍) spring boot 学习之路3( 集成my ...

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

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

  3. Spring/SpringMVC在启动完成后执行方法

    在某些情况下,有可能你会有这种需求:在Spring/SpringMVC项目中,当Spring/SpringMVC启动完成后,你需要执行一个方法来完成某些事件(比如创建网站地图,比如从订阅Redis服务 ...

  4. Springboot - 在启动完成后执行特定方法

    1.实现方式 实现ApplicationRunner接口 实现CommandLineRunner接口 @Component @Slf4j public class AfterServiceStarte ...

  5. 如何让spring mvc web应用启动时就执行特定处理

    Asp.Net的应用中通过根目录下的Global.asax,在Application_Start方法中做一些初始化操作,比如:预先加载缓存项对网站热点数据进行预热,获取一些远程的配置信息等等. Spr ...

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

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

  7. springmvc拦截器入门及其执行顺序源码分析

    springmvc拦截器是偶尔会用到的一个功能,本案例来演示一个较简单的springmvc拦截器的使用,并通过源码来分析拦截器的执行顺序的控制.具体操作步骤为:1.maven项目引入spring依赖2 ...

  8. redhat的启动方式和执行次序

    rc.d的内容如下: init.d/ :各种服务器和程序的二进制文件存放目录. rcx.d/: 各个启动级别的执行程序连接目录.里头的东西都是指向init.d/的一些软连接.具体的后边叙述. 还有三个 ...

  9. java中服务器启动时,执行定时任务

    package com.ripsoft.util; import java.util.Calendar; import java.util.Timer; import javax.servlet.Se ...

随机推荐

  1. “FPGA+云"助力高性能计算

    用AI防鲨鱼.用AI学写中国书法.用AI预测人类死亡时间.用AI审判罪犯……在人工智能方兴未艾的今天,越来越廉价和普及的AI领域真的是什么都不值钱,除了想象力.那在这无所不能的AI盛世,一定没道理让算 ...

  2. (转)SQL server 2005查询数据库表的数量和表的数据量

    本文转载自:http://hi.baidu.com/ajyajyajy/item/4e2a7f4dc83393d2c1a592c1 use DBNAMEgoselect * from sysobjec ...

  3. mysql索引之一:索引基础(B-Tree索引、哈希索引、聚簇索引、全文(Full-text)索引区别)(唯一索引、最左前缀索引、前缀索引、多列索引)

    没有索引时mysql是如何查询到数据的 索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储10 ...

  4. locale错误导致Java中文乱码错误的总结

    线上执行MapReduce任务计算时,经过排查发现了某些服务器计算的数据出现中文乱码问题,但是服务器的配置是完全一致的.由于我们使用的key可能包含中文,中文乱码问题体现在每次合并map记录的时候计算 ...

  5. MySQL 5.7 坑爹参数 – log_timestamps

    官网原话: This variable was added in MySQL 5.7.2. Before 5.7.2, timestamps in log messages were written ...

  6. OCR (Optical Character Recognition,光学字符识别)

    OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗.亮的模式确定其形状,然后用字符识别方法将形状翻译 ...

  7. git submodule一些操作

    checkout指定tag cd /path/to/yoursubmodule git checkout yourTag cd .. git add yoursubmodule git commit ...

  8. ansible初识三

    一.setup模块 ansible的 setup模块主要用来收集信息, 查看参数: [root@localhost ~]# ansible-doc -s setup # 查看参数,部分参数如下: fi ...

  9. Django xadmin的使用 (三)

    关于报错: 1.在页面添加好新的用户后登录报错 解决方法: 新建一个app,名叫app D:\myfiles\study\python\django\datas>python manage.py ...

  10. SpringMVC前后台数据传递中Json格式的相互转换(前台显示格式、Json-lib日期处理)及Spring中的WebDataBinder浅析

    两个方向: 一.前台至后台: Spring可以自动封装Bean,也就是说可以前台通过SpringMVC传递过来的属性值会自动对应到对象中的属性并封装成javaBean,但是只能是基本数据类型(int, ...