1. 程式人生 > >task定時任務不能自動注入 問題解決辦法

task定時任務不能自動注入 問題解決辦法

在定時任務執行的時候,當時間點到了,執行job的時候,有時候需要用到某些bean,但是自動注入是不行的,所以只能想其他辦法,我的類

public class CommonJob extends MethodInvokingJob {)
    	private MessageProducer messageProducer = (MessageProducer) SpringContextHolder.getBean("messageProducer");
	private JRedisClient jRedisClient = (JRedisClient) SpringContextHolder.getBean("jRedisClient");
}

至於SpringContextHolder類.

package com.topband.util;

import org.apache.commons.lang3.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;

/**
 * 以靜態變數儲存Spring ApplicationContext, 可在任何程式碼任何地方任何時候取出ApplicaitonContext.
 */
@Service
@Lazy(false)
public class SpringContextHolder implements ApplicationContextAware, DisposableBean {

	private static ApplicationContext applicationContext = null;

	private static Logger logger = LoggerFactory.getLogger(SpringContextHolder.class);

	/**
	 * 取得儲存在靜態變數中的ApplicationContext.
	 */
	public static ApplicationContext getApplicationContext() {
		assertContextInjected();
		return applicationContext;
	}

	/**
	 * 從靜態變數applicationContext中取得Bean, 自動轉型為所賦值物件的型別.
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getBean(String name) {
		assertContextInjected();
		return (T) applicationContext.getBean(name);
	}

	/**
	 * 從靜態變數applicationContext中取得Bean, 自動轉型為所賦值物件的型別.
	 */
	public static <T> T getBean(Class<T> requiredType) {
		assertContextInjected();
		
		return applicationContext.getBean(requiredType);
	}

	/**
	 * 清除SpringContextHolder中的ApplicationContext為Null.
	 */
	public static void clearHolder() {
		if (logger.isDebugEnabled()) {
			logger.debug("清除SpringContextHolder中的ApplicationContext:" + applicationContext);
		}
		applicationContext = null;
	}

	/**
	 * 實現ApplicationContextAware介面, 注入Context到靜態變數中.
	 */
	public void setApplicationContext(ApplicationContext applicationContext) {
		SpringContextHolder.applicationContext = applicationContext;
	}

	/**
	 * 實現DisposableBean介面, 在Context關閉時清理靜態變數.
	 */
	public void destroy() throws Exception {
		SpringContextHolder.clearHolder();
	}

	/**
	 * 檢查ApplicationContext不為空.
	 */
	private static void assertContextInjected() {
		Validate.validState(applicationContext != null,
				"applicaitonContext屬性未注入, 請在applicationContext.xml中定義SpringContextHolder.");
	}
}

這樣子,就能找到你想要的bean檔案了.