如何让springmvc在启动的时候执行特定的业务处理
如何让springmvc在启动的时候执行特定的业务处理
java 的 web服务器启动时,经常会做一些特定的业务逻辑处理,比如数据库初始化,
初始化系统参数,读取配置文库等。
很多web服务的中间件,可以 通过这样的思路去实现。比如消息分发服务。
实现方法:
一、Web项目,非Spring
解决方法:实现【 ServletContextListener】 接口
(1)、把实现了ServletContextListener 的类配置到【 web.xml】 文件中
- <?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>
<?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)、加入自己的实现逻辑
- 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("系统初始化结束...");
- }
- }
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接口
- 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;
- }
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 接口
- package org.springframework.web.context;
- import javax.servlet.ServletContext;
- import org.springframework.beans.factory.Aware;
- public interface ServletContextAware extends Aware {
- void setServletContext(ServletContext var1);
- }
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 接口
- package org.springframework.beans.factory;
- public interface InitializingBean {
- void afterPropertiesSet() throws Exception;
- }
package org.springframework.beans.factory;
public interface InitializingBean {
void afterPropertiesSet() throws Exception;
}
4、ApplicationListener<ApplicationEvent> 接口
- 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);
- }
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代码:
- 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");
- }
- }
- }
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在启动的时候执行特定的业务处理的更多相关文章
- springboot 学习之路 9 (项目启动后就执行特定方法)
目录:[持续更新.....] spring 部分常用注解 spring boot 学习之路1(简单入门) spring boot 学习之路2(注解介绍) spring boot 学习之路3( 集成my ...
- spring mvc web应用启动时就执行特定处理(线程启动)
package com.sdt.platform.index.controller; import java.net.URL; import java.util.List; import java.u ...
- Spring/SpringMVC在启动完成后执行方法
在某些情况下,有可能你会有这种需求:在Spring/SpringMVC项目中,当Spring/SpringMVC启动完成后,你需要执行一个方法来完成某些事件(比如创建网站地图,比如从订阅Redis服务 ...
- Springboot - 在启动完成后执行特定方法
1.实现方式 实现ApplicationRunner接口 实现CommandLineRunner接口 @Component @Slf4j public class AfterServiceStarte ...
- 如何让spring mvc web应用启动时就执行特定处理
Asp.Net的应用中通过根目录下的Global.asax,在Application_Start方法中做一些初始化操作,比如:预先加载缓存项对网站热点数据进行预热,获取一些远程的配置信息等等. Spr ...
- 转载:如何让spring mvc web应用启动时就执行
转载:如何让spring mvc web应用启动时就执行特定处理 http://www.cnblogs.com/yjmyzz/p/4747251.html# Spring-MVC的应用中 一.Appl ...
- springmvc拦截器入门及其执行顺序源码分析
springmvc拦截器是偶尔会用到的一个功能,本案例来演示一个较简单的springmvc拦截器的使用,并通过源码来分析拦截器的执行顺序的控制.具体操作步骤为:1.maven项目引入spring依赖2 ...
- redhat的启动方式和执行次序
rc.d的内容如下: init.d/ :各种服务器和程序的二进制文件存放目录. rcx.d/: 各个启动级别的执行程序连接目录.里头的东西都是指向init.d/的一些软连接.具体的后边叙述. 还有三个 ...
- java中服务器启动时,执行定时任务
package com.ripsoft.util; import java.util.Calendar; import java.util.Timer; import javax.servlet.Se ...
随机推荐
- clientHeight , scrollHeight , offsetHeight之间的区别及兼容方案
clientHeight , scrollHeight , offsetHeight相信每个人都用过,可是每次用都要查一下到底哪个是文档大小哪个是视口大小,还有头疼的兼容问题. 先来官方的了解一下这三 ...
- java代码----FileInputStream 和File
总结:程序运行后,发现新建的两个文件里的东西突然i清空了.以为是程序出错了. 然后慌了,之后我再运行时,发现可以了.是电脑的问题吧 一如既往的打扰他,只因为他优秀 package com.a.b; i ...
- [Java][Web]Request 实现转发和 MVC 设计模式
String data = "aaaaa"; request.setAttribute("data",data); // 将数据存在 request reque ...
- Codeforces-708C(树形DP)
一.题意 给定一颗树,对于每一个节点,判断能否在树中删除某一条边,然后在任意两个节点之间加一条边,使这个点成为重心. 注:删除树中某一条边后,标程并不会这么无聊地把这棵树变成两个孤立的连通图,而是再让 ...
- mysql where语句中 or 和 and连用注意点
在mysql中,经常会遇到这样的情况,在写条件语句where时,可能会同时有多个条件的“或”或者“与”,但经常会达不到效果,经百度,本人发现一个where语句中同时出现条件的“与”或者“或的时候”,要 ...
- IDA Pro 权威指南学习笔记(十) - 栈帧
栈帧(stack frame)是在程序的运行时栈中分配的内存块,用于特定的函数调用 如果一个函数没有执行则不需要内存,当函数被调用时就需要用到内存 1.传给函数的参数的值需要存储到函数能够找到它们的位 ...
- Python+Selenium爬虫实战一《将QQ今日话题发布到个人博客》
前提条件: 1.使用Wamp Server部署WordPress个人博客,网上资料较多,这里不过多介绍 思路: 1.首先qq.com首页获取到今日话题的的链接: 2.通过今日话题链接访问到今日话题,并 ...
- 第二章:Android Studio概述(一)[学习Android Studio汉化教程]
Android Studio是一个视窗化的开发环境.为了充分利用有限的屏幕空间,不让你束手束脚,Android Studio 在特定的时间仅仅显示一小部分可用窗口. 除了一些上下文敏感的窗口和上下文 ...
- linux 监控系统剩余内存大小
cur_free = `free -m | awk '/buffers\// {print $NF}'` chars="current memory is $cur_free." ...
- Python小知识点(3)--装饰器
(1)装饰器含参数,被装饰函数不含(含)参数 实例代码如下: import time # 装饰器函数 def wrapper(func): def done(*args,**kwargs): star ...