今天遇到一个问题,需要在项目中加入一个定时器,需要在项目启动后就执行,所以就在网上找spring容器初始化之后就执行的方法有什么:

查了很多资料,总共找到了两个符合条件的方法,都是用了一下之后,结合网上的信息说说我个人的理解:

1.写一个类,实现BeanPostProcessor,这个接口有两个方法:

(1)postProcessBeforeInitialization方法,在spring中定义的bean初始化前调用这个方法;

(2)postProcessAfterInitialization方法,在spring中定义的bean初始化后调用这个方法;

首先,开始我试过这个方法,才发现,这个接口是在spring容器启动时,每初始化一个bean,便会调用一次,也就是说,你初始化多少个bean,变回调用多少次,当然也就不符合我之前的需求;

2.之后,我找到了另外一个方法,写一个类,实现InitializingBean接口:

(1)实现这个接口,只要实现afterPropertiesSet()这个方法,将你要预处理的代码写在里面,spring容器启动后,就会执行这个里面的方法。


很明显,最后一个符合我的需求,我将计时器代码写在实现InitializingBean接口的类中afterPropertiesSet()方法里面。

public class DayTradeTimer implements InitializingBean{

	/**
	 * 
	 */
	private static final long serialVersionUID = -5173826987102711830L;
	
	@SuppressWarnings("deprecation")
	public void afterPropertiesSet() throws Exception {
		// TODO Auto-generated method stub
		Date date = new Date();
		//每天凌晨两点执行
		if((date.getHours()==2 && date.getMinutes()>0) || (date.getHours()>2)){
			date.setDate(date.getDate()+1);
		}
		date.setHours(2);
		date.setMinutes(0);
		date.setSeconds(0);
		
		Timer timer = new Timer();
		timer.scheduleAtFixedRate(new TimerTask() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				System.out.println("***********计时器*****************");
			}
		}, date, 1000*60*60*24);
	}
	
}


最后,再贴一个servlet在web容器启动时执行的方法

<servlet> 
    <servlet-name>myServlet</servlet-name> 
    <servlet-class>com.servlet.MyServlet</servlet-class> 
    <load-on-startup>1</load-on-startup><!--加这个标签,tomcat启动时会自动加载指定的servlet,值是servlet的加载顺序, 数字越小代表加载的优先级越高--> 
</servlet> 



Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐