javaweb启动项目时执行任务

本文介绍了在JavaWeb项目启动后立即执行任务的三种方法:1)配置监听器,2)使用Spring的BeanPostProcessor接口,3)通过Spring的@Scheduled注解执行定时任务,并详细解释了各种方法的执行时机和注意事项,特别是在处理数据库交互时避免懒加载异常的问题。
摘要由CSDN通过智能技术生成

在项目中有些常量需要在项目启动后动态设置的,这就需要启动项目后就立即执行一个任务。总结了一下几个方法


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会抛懒加载异常 。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值