spring的@Autowired注入的bean为null

今天工作的时候需要做一个定时任务,在定时任务的job类中,需要调用之前的写好逻辑的service的代码。假设我的job类是MyJob,调用的service名称是MyService。而MyService中需要用到注入另一个service,名称是FlowService。

首先,这几个类都要纳入spring的管理,需要加上@Controller,@Service注解。我第一次就忘了在MyJob上面加注解了,所以不行。

同时因为我们调用的MyService需要注入其他的service,所以在MyJob类中不能通过new MyService()来调用其方法。原因是当我们这样做的时候,我们得到的MyService的实例就不是spring管理的bean了,这样的话,注入FlowService的时候是不会成功的,一直会是null。因此我们需要在MyJob中也通过@Autowired注解来注入MyService。但是当我这样做了之后,调试代码的时候,发现注入到MyJob中的MyService是null,这样就连调用MyService的代码都出错了。后来通过查资料,看博客才知道找到了下面的解决办法:

在MyJob中,添加一个构造方法,添加一个静态变量,添加一个被@PostConstruct修饰的方法;具体代码如下:

@Controller
public class MyJob implements Job {
	private static final Logger LOG = LoggerFactory
			.getLogger(MyJob.class);

	private static final Lock executelock = new ReentrantLock(true);
	
	@Autowired
	private MyService myService;
	
	public static MyJob myJob ;
	public MyJob (){
		
	}
	
	@PostConstruct
	public void init(){
		myJob =this;
	}
	
	@Override
	public void execute(JobExecutionContext context)
			throws JobExecutionException {
		// TODO Auto-generated method stub
		if (executelock.tryLock()) {
			LOG.info("获取【互斥锁】,开始自动保存发送给工作人员的信息");
			try{
				myJob.myService.saveMsgSendBoxShouLiToMember();
			}catch(Exception e){
				System.out.println("执行失败");
				LOG.error("自动保存发送给工作人员的信息任务发生异常:" + e);
			} finally {
				executelock.unlock();
				LOG.info("自动保存发送给工作人员的信息任务结束,释放【互斥锁】执行结束!");
			}
		} else {
			LOG.info("没有获取【互斥锁】, 自动保存发送给工作人员的信息任务放弃本次执行!");
		}
		
	}
}

注意调用myservie的方法时,通过的myJob.myService.saveMsgSendBoxShouLiToMember();去调用

 

参考博客:https://blog.csdn.net/qiulingxin/article/details/78068314

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值