在一个网站启动、结束时,我们经常有些操作是需要执行的。
熟悉Asp.net的朋友,使用Global.asax很容易就搞定,在其中有Application_Start和Application_End等方法可以供我们来轻松实现。
原理:使用注解@PostConstruct和@PreDestroy来实现功能。 从Java EE 5规范开始,Servlet中增加了两个影响Servlet生命周期的注解(Annotion);@PostConstruct和@PreDestroy。这两个注解被用来修饰一个非静态的void()方法 。写法有如下两种方式: @PostConstruct public void applicationStart(){ System.out.println("application start"); }
public @PostConstruct void applicationStart(){ System.out.println("application start"); } 被@PostConstruct修饰的方法会在服务器加载Servle的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。执行生命周期如下: |
下边直接来看程序中怎么写吧,下图是我用来测试的项目结构,标红的3个是这个功能需要涉及的文件。
其中,web.xml用来配置Spring的servlet,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>InskyScheduleCenter</display-name>
<!-- Spring应用上下文, 理解层次化的ApplicationContext --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/config/spring/applicationContext*.xml</param-value> </context-param>
<!-- DispatcherServlet, Spring MVC的核心 --> <servlet> <servlet-name>InskyScheduleCenter</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- DispatcherServlet对应的上下文配置, 默认为/WEB-INF/$servlet-name$-servlet.xml --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/config/spring/ScheduleCenter-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>InskyScheduleCenter</servlet-name> <!-- mvc-dispatcher拦截所有的请求 --> <url-pattern>/</url-pattern> </servlet-mapping>
</web-app> |
这个文件没啥说的,只是标明contextConfigLocation的位置。
再看ScheduleCenter-servlet.xml文件。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 本配置文件为InskyScheduleCenter项目提供其相关的Spring MVC配置 -->
<!-- 启用Spring基于annotation的DI, 使用户可以在Spring MVC中使用Spring的强大功能。 激活 @Required @Autowired,JSR 250's @PostConstruct, @PreDestroy and @Resource 等标注 --> <context:annotation-config />
<!-- 扫描自动加载的包名 --> <context:component-scan base-package="com.insky.InskyScheduleCenter.web"> </context:component-scan>
</beans> |
package com.insky.InskyScheduleCenter.web.util;
import javax.annotation.PostConstruct; import javax.annotation.PreDestroy;
import org.springframework.stereotype.Service;
/** * * web应用的全局事件 * @author Simon * */ @Service public class global {
/** * 在web启动时执行 */ @PostConstruct public void applicationStart(){ System.out.println("application start"); }
/** * 在web结束时执行 */ @PreDestroy public void applicationEnd(){ System.out.println("InskyScheduleCenter application end");
} } |
我们看到,这个类位于配置的被扫描包名com.insky.InskyScheduleCenter.web之下。
注意global.java的class顶部被标红的注解@Service,在很多文章中,其贴出的代码上没有这个注解,很多照做的新手朋友最终没有加上,运行的时候就没有效果了,最终会多花很多时间去找问题。
当然,实现这个功能还有很多其它的方式,如实现ApplicationListener接口等,我将会在未来的文章中阐述其它们。