在项目中有些常量需要在项目启动后动态设置的,这就需要启动项目后就立即执行一个任务。总结了一下几个方法
1.配置监听器
package com.global.web;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpServlet;
public class extends HttpServlet implements ServletContextListener {
private static final long serialVersionUID = -3189203153904874518L;
//服务器停止时执行该事件
public void contextDestroyed(ServletContextEvent sce) {
}
//服务器启动时执行该事件
public void contextInitialized(ServletContextEvent sce) {
}
}
在web.xml中配置
<listener>
<listener-class>com.global.web.ServletListenerController</listener-class>
</listener>
这种方法是在服务器启动的时候同步执行的spring中的bean对象未实例化。
2.spring的BeanPostProcessor接口
package com.global.web;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class ServletListenerController implements BeanPostProcessor {
//bean实例化之后执行
public Object postProcessAfterInitialization(Object bean, String arg1)
throws BeansException {
// TODO Auto-generated method stub
return bean;
}
//bean实例化之前执行
public Object postProcessBeforeInitialization(Object bean, String arg1)
throws BeansException {
// TODO Auto-generated method stub
return bean;
}
}
在Spring的配置文件中配置
<bean class="com.global.web.ServletListenerController"/>
在spring会先将实现了BeanPostProcessor的类实例化,然后在实例化bean的时候会执行BeanPostProcessor的两个方法 返回值返回bean
3.Spring中使用注解@Scheduled执行定时任务
配置文件设置
<?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:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd"
default-lazy-init="true">
<task:annotation-driven/>
</beans>
@Scheduled(fixedDelay = 5000)
public void setValue() {
//五秒后执行 在web项目中项目启动后会自动执行一次 五秒后再次执行
}
@Scheduled(cron = "0 0/1 * * * ?")
public void setValue() {
}
附:cron常用表示:
CronTrigger配置格式:
格式: [秒] [分] [小时] [日] [月] [周] [年]
常用实例格式:
0 0 12 * * ? 每天12点触发
0 15 10 ? * * 每天10点15分触发
0 15 10 * * ? 每天10点15分触发
0 15 10 * * ? * 每天10点15分触发
0 15 10 * * ? 2005 2005年每天10点15分触发
0 * 14 * * ? 每天下午的 2点到2点59分每分触发
0 0/5 14 * * ? 每天下午的 2点到2点59分(整点开始,每隔5分触发)
0 0/5 14,18 * * ? 每天下午的 2点到2点59分(整点开始,每隔5分触发) 每天下午的 18点到18点59分(整点开始,每隔5分触发)
0 0-5 14 * * ? 每天下午的 2点到2点05分每分触发
0 10,44 14 ? 3 WED 3月分每周三下午的 2点10分和2点44分触发
0 15 10 ? * MON-FRI 从周一到周五每天上午的10点15分触发
0 15 10 15 * ? 每月15号上午10点15分触发
0 15 10 L * ? 每月最后一天的10点15分触发
0 15 10 ? * 6L 每月最后一周的星期五的10点15分触发
0 15 10 ? * 6L 2002-2005 从2002年到2005年每月最后一周的星期五的10点15分触发
0 15 10 ? * 6#3 每月的第三周的星期五开始触发
0 0 12 1/5 * ? 每月的第一个中午开始每隔5天触发一次
0 11 11 11 11 ? 每年的11月11号 11点11分触发
注意:
1、spring的注解@Scheduled 需要写在实现方法上;
2、定时器的任务方法不能有返回值(如果有返回值,spring初始化的时候会告诉你有个错误、需要设定一个proxytargetclass的某个值为true),不能指向任何的参数;
3、如果该方法需要与应用程序上下文的其他对象进行交互,通常是通过依赖注入来实现;
4、实现类上要有组件的注解@Component或者@Service .
前两种方法执行时spring未完全实例化bean如果这时与数据库交互Hibernate会抛懒加载异常 。