栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

继承timetask的类使用@Autowired注入为null,类加了@component构成方法参数报错

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

继承timetask的类使用@Autowired注入为null,类加了@component构成方法参数报错

最近遇到一个问题,写了一个定时任务类,这个类继承了Timetask,需要在这个定时任务类中注入一个XXXService。
最开始我是这样写的:

public class AutoSingleXmYckbTask extends TimerTask {
	@Autowired
	private XxxxService xxxxService;

	private String xx;

	public AutoSingleXmYckbTask(String xx){
        this.xx=xx;
    }
@Override
    public void run() {
        try{
            xxxxService.updateXxxx(xx);
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}

结果,代码执行后报了空指针异常,xxxxService = null;
后来查了一下,说在普通类中使用@Autowired,需要在类上加@Component,然后我就在类上加了@Component,结果加完了这个注解后,构造方法的参数报错了(具体原因有待分析,以后补充)如下:

@Component
public class AutoSingleXxxxTask extends TimerTask {
	@Autowired
	private XxxxService xxxxService;

	private String xx;
	//加了@Component,这个构造方法的参数xx报错了
	public AutoSingleXxxxTask(String xx){
        this.xx=xx;
    }
@Override
    public void run() {
        try{
            xxxxService.updateXxxx(xx);
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}
最终的解决办法

使用外部注入解决了这个问题,具体代码如下:
1.这个定时任务类的代码,给xxxxService设置了geter,seter方法

public class AutoSingleXxxxTask extends TimerTask {


    private XxxxService xxxxService;

    public XxxxService getXxxxService() {
        return xxxxService;
    }

    public void setXxxxService(XxxxService xxxxService) {
        this.xxxxService = xxxxService;
    }


    private String xx;

    public AutoSingleXxxxTask(String xx){
        this.xx=xx;
    }

    @Override
    public void run() {
        try{
            xxxxService.updateAutoXxxxZt(xx);
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2.因为调用这个定时任务类的地方,是另一个Service类,在这个Service类中可以正常使用@Autowired注入定时任务类XxxxService,所以可以在调用这个类的时候,把xxxxService,用setXxxxService注入到类中。代码如下

@Service
public class XxxxServiceImpl implements XxxxService {
			@Autowired//在这个调用那个定时任务类的类里,可以正常使用@Autowired注入xxxxService
			private XxxxService xxxxService;
			public void saveXxxx(Xxxx xxxx){
    			
				Timer timer = new Timer(true);
            	Date time = DateUtil.transfer2Date(xxxx.getxxsj());
            	//new一个定时任务类对象
	            AutoSingleXxxxTask autoSinglexxxxTask = new AutoSingleXxxxTask(xxxx.getxx());
	            //把xxxxService,set进定时任务类中,就可以正常使用了
            	autoSingleXxxxTask.setXxxxService(xxxxService);
            	timer.schedule(autoSingleXxxxTask, time);
			}
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/333336.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号