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

来源:互联网 发布:勇敢一点 薛之谦 知乎 编辑:程序博客网 时间:2024/05/24 15:36

一、Web项目,非Spring

1.需求:很多时候,在一个 web 项目启动的时候,我们都要【初始化很多系统参数,比如读取配置文件】,或者初始化数据库表...

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

2.1.把实现了ServletContextListener 的类配置到【 web.xml】 文件中

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  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>  


2.2.加入自己的实现逻辑

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  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.   
  8.     public void contextInitialized(ServletContextEvent e) {  
  9.         logger.info("系统初始化开始...");  
  10.           
  11.         // 获取项目根目录  
  12.         String root_path  = e.getServletContext().getRealPath("/");  
  13.         logger.info("application path : {}",root_path);  
  14.           
  15.         // 初始化 ConfigFactorty  
  16.         ConfigFactory.init(root_path);  
  17.         // 初始化数据链接信息  
  18.         DBManager.init();  
  19.         // 初始化定时统计任务  
  20.         TaskManager.init();  
  21.         // 初始化用户信息查询位置  
  22.         UserInfo.init();  
  23.           
  24.         logger.info("系统初始化结束...");  
  25.     }  
  26.       
  27. }  


作者:菩提树下的杨过
出处:http://yjmyzz.cnblogs.com 

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。


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

二、Spring项目

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

1、ApplicationContextAware接口

1
2
3
4
5
6
7
8
9
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
2
3
4
5
6
7
8
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
2
3
4
5
package org.springframework.beans.factory;
 
public interface InitializingBean {
    void afterPropertiesSet() throws Exception;
}

4、ApplicationListener<ApplicationEvent> 接口

1
2
3
4
5
6
7
8
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);
}

示例程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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方法中处理。


0 0
原创粉丝点击