SpringMVC中如何在网站启动、结束时执行代码(详细,确保可用)
在一个网站启动、结束时,我们经常有些操作是需要执行的。
熟悉Asp.net的朋友,使用Global.asax很容易就搞定,在其中有Application_Start和Application_End等方法可以供我们来轻松实现。
但是,在Java的SpringMVC框架中,需要如何实现这个功能呢?在互联网上,有不少类似文章,介绍功能的实现,我看过很多篇文档,基本都在一些关键点有所缺失,很多新手朋友照做往往达不到效果,下面我来阐述一下我正在使用的方法。
| 原理:使用注解@PostConstruct和@PreDestroy来实现功能。 从Java EE 5规范开始,Servlet中增加了两个影响Servlet生命周期的注解(Annotion);@PostConstruct和@PreDestroy。这两个注解被用来修饰一个非静态的void()方法 。写法有如下两种方式: @PostConstruct public System.out.println("application start"); } 
 public @PostConstruct void applicationStart(){ System.out.println("application start"); } 被@PostConstruct修饰的方法会在服务器加载Servle的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。执行生命周期如下: 
 | 
下边直接来看程序中怎么写吧,下图是我用来测试的项目结构,标红的3个是这个功能需要涉及的文件。

其中,web.xml用来配置Spring的servlet,内容如下:
| <?xml <web-app 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"> 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 </web-app> | 
这个文件没啥说的,只是标明contextConfigLocation的位置。
再看ScheduleCenter-servlet.xml文件。
| <?xml <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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"> 
 
 
 
 
 @Autowired,JSR 250's @PostConstruct, @PreDestroy and @Resource 等标注 --> 
 
 
 
 
 
 
 </beans> | 
其中,<context:annotation-config
					/>一定要加上,这样才可以激活对@PostConstruct和@PreDestroy等注解。自动扫描的包名也要写对,确保我们的功能类global.java在配置的包名下。
最后看global.java文件。
| package com.insky.InskyScheduleCenter.web.util; 
 import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; 
 import org.springframework.stereotype.Service; 
 /** * * web应用的全局事件 * @author Simon * */ @Service public 
 /** * 在web启动时执行 */ @PostConstruct public System.out.println("application start"); } 
 /** * 在web结束时执行 */ @PreDestroy public System.out.println("InskyScheduleCenter application end"); 
 } } | 
我们看到,这个类位于配置的被扫描包名com.insky.InskyScheduleCenter.web之下。
其中,在applicationStart和applicationEnd方法之上,存在注解@PostConstruct和@PreDestroy,当网站启动时,自动扫描到这两个注解时,在相应的生命周期,就会执行被注解的方法。
注意global.java的class顶部被标红的注解@Service,在很多文章中,其贴出的代码上没有这个注解,很多照做的新手朋友最终没有加上,运行的时候就没有效果了,最终会多花很多时间去找问题。
因为配置文件中的<context:component-scan base-package="com.insky.InskyScheduleCenter.web"></context:component-scan>只有扫描到有@Component @Controller@Service等这些注解的类,才会把这些类注册为bean,只有被注册为bean,才会加载到web容器的生命周期。
当然,实现这个功能还有很多其它的方式,如实现ApplicationListener接口等,我将会在未来的文章中阐述其它们。
SpringMVC中如何在网站启动、结束时执行代码(详细,确保可用)的更多相关文章
- JS流程控制语句 做判断(if语句)if语句是基于条件成立才执行相应代码时使用的语句。语法:if(条件) { 条件成立时执行代码}
		做判断(if语句) if语句是基于条件成立才执行相应代码时使用的语句. 语法: if(条件) { 条件成立时执行代码} 注意:if小写,大写字母(IF)会出错! 假设你应聘web前端技术开发岗位,如果 ... 
- 判断语句(if...else)if...else语句是在指定的条件成立时执行代码,在条件不成立时执行else后的代码
		判断语句(if...else) if...else语句是在指定的条件成立时执行代码,在条件不成立时执行else后的代码. 语法: if(条件) { 条件成立时执行的代码 } else { 条件不成立时 ... 
- Spring-boot 启动完成时执行指定任务
		在服务启动完成时,如果需要执行一些特定的预加载任务,则可以通过实现 CommandLineRunner 接口来实现. 实现 @Component public class Started implem ... 
- 齐博cms最新SQL注入网站漏洞 可远程执行代码提权
		齐博cms整站系统,是目前建站系统用的较多的一款CMS系统,开源,免费,第三方扩展化,界面可视化的操作,使用简单,便于新手使用和第二次开发,受到许多站长们的喜欢.开发架构使用的是php语言以及mysq ... 
- SpringMVC中向服务器传递时间参数时出现的问题
		1. 问题描述: 今天在SpringMVC应用中上传参数的时候遇到如下问题: The request sent by the client was syntactically incorrect 这说 ... 
- 在SpringMVC中使用@RequestBody注解处理json时,报出HTTP Status 415的解决方案
		Spring的@RequestBody非常牛x,可以将提交的json直接转换成POJO对象. 正好今天有这样的需求,使用一下,结果一直报415,十分头疼. HTTP 415 错误 – 不支持的媒体类型 ... 
- SpringMVC中在Controller类的每个方法执行前调用某个方法的实现
		在使用SpringMVC做项目的时候,如果想在@Controller类中每个@RequestMapping方法执行前都调用某个方法,要怎么实现呢?答案是使用Spring的@ModelAttribute ... 
- is7.0中发布mvc网站,一直无法正常执行路由的解决办法
		在config中加一句话: <system.webServer> <validation validateIntegratedModeConfiguration="fals ... 
- IDEA问题之“微服务启动项目时,不会加载Spring Boot到Services中”
		1.启动项目时,不会加载Spring Boot到Services中 现象解析: 启动项目时 会在debug的位置加载项目 注:这里没有配图,因为问题已解决,未记录图,需往后遇到记录 解决方案: 需要在 ... 
随机推荐
- .NET FRAMEWORK版本:4.0.30319; ASP.NET版本:4.6.118.0
			https://gqqnbig.me/2015/11/23/net-framework%e7%89%88%e6%9c%ac4-0-30319-asp-net%e7%89%88%e6%9c%ac4-6- ... 
- CCS5.2/CCS5.3/CCS5.4 仿真调试小技巧
			操作系统: WinXP 32bit 仿真器: SEED-XDS560 Plus 开发环境: DSP.com/forum.php?mod=forumdisplay&fid=58" ta ... 
- 一个简单的 Web 服务器 [未完成]
			最近学习C++,linux和网络编程,想做个小(mini)项目. 就去搜索引擎, 开源中国, Sourceforge上找http server的项目. 好吧,也去了知乎. 知乎上程序员氛围好, ... 
- 利用Tomcat内置的servlet实现文件下载功能
			起因 最近博客所在的VPS挂了又要重装系统,又要重装各种软件. 以前我也经常更换VPS,每次更换都是各种坑爹事情..比如要下载java.下载tomcat.下载mysql..........以前每次我都 ... 
- ASP.MVC 基于AuthorizeAttribute权限设计案例
			ASP.MVC上实现权限控制的方法很多,比如使用AuthorizeAttribute这个特性 1.创建自定义特性用于权限验证 public class AuthorizeDiy : Authorize ... 
- Linux基础知识整理
			一.基础知识 1.Linux简介 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件 ... 
- 如何让vim自动显示函数声明-使用 echofunc.vim插件
			echofunc.vim可以显示函数的declaration, 默认的是针对c/c++, 对于php, 只要 启用了 ctags都可以, 因为echofunc是从tags file中获取数据的... ... 
- BFC
			先看一下英文解释:Floats, absolutely positioned elements, block containers (such as inline-blocks, table-cell ... 
- RabbitMQ常用命令行
			打印了一些rabbitmq服务状态信息,包括内存,硬盘,和使用erlong的版本信息rabbitmqctl -q status 各个参数说明:http://www.rabbitmq.com/man/r ... 
- centos 7配置网络 更新yum源
			cd /etc/sysconfig/network-script/ 找到对应的ifcfg-entxxxx文件,然后添加网关,修改dhcp为static,静态ip,添加IPADDR ip地址.onboo ... 
 
			
		