SpringMVCでタイマーがTaskを継承してサービスに問題を注入できない

3221 ワード

最近Spring+MyBatisのプロジェクトをしていますが、Redisのストレージが使用され、問題が発生しました.
RedisTaskはタイマーで毎分データベースのようにプッシュされているので、
public class RedisTask  extends Task {

    public void execute(TaskExecutionContext executor) throws RuntimeException {
        Scheduler scheduler = executor.getScheduler();
        TaskExecutor[] executors = scheduler.getExecutingTasks();
        if(executors!=null && executors.length>1)//             

そしてタイマのタスクでRedisの呼び出しによりローカルデータベースにプッシュ
OrderService orderService = new OrderService();
Order order = new Order();
int num = orderService.add(order);
System.out.println("     :" + num);

そこで問題が発生し、tomcatがタイマを呼び出さなかったRedisTaskがエラーを報告し始め、debugはorderServiceがnullであることを発見し、つまりサービスが注入されていないことを発見した.
それから私はSpringのプロファイルの中で表示の問題を見て、まったく問題がないことを発見して、それからこの方法がTaskを継承したことを発見して、そこでぼんやりと悟りました
:タイマがTaskを継承すると、タイマがこのメソッドを呼び出すと、注釈を急いで注入しないようにexecuteメソッドが直接実行されます.
  @Resource
    private OrderService orderService;

ソリューション:
1、ApplicationContextUtilを導入するツール類
package com.aneop.common.util;

import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class ApplicationContextUtil implements ApplicationContextAware { 
	private static ApplicationContext applicationContext;

	public static ApplicationContext getApplicationContext() {
		return applicationContext;
	}

	public void setApplicationContext(ApplicationContext applicationContext) {
		ApplicationContextUtil.applicationContext = applicationContext;
	}

	public static Object getBean(String beanName) {
		return applicationContext.getBean(beanName);
	}
}

2.executeメソッドでこのようにサービスを注入する
OrderService orderService = (OrderService)ApplicationContextUtil.getBean("orderService");

注意:サービスのインタフェースの@Serviceタグには、入力した名前を明記する必要があります.
@Service("orderService")
public class OrderServiceImpl implements OrderService {

 
これで問題は完璧に終わり、今晩redisの使用を新しいブログに書きます.OK、仕事が終わるのを待っています.