实现Runnable接口,自定义实现类传参问题
创作时间:
作者:
@小白创作中心
实现Runnable接口,自定义实现类传参问题
引用
CSDN
1.
https://m.blog.csdn.net/weixin_42752467/article/details/144865777
在使用Spring框架和线程池时,如何正确传递参数到Runnable实现类是一个常见的问题。本文通过一个具体的错误案例,详细解释了为什么需要无参构造器,并提供了两种解决方案。
在学习使用线程池(ThreadPoolTaskExecutor)开启多线程的过程中,发现自定义实现类实现Runnable接口,使用有参构造器进行参数的传递,出现如下报错:
Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'executorTestImpl' defined in file [******************************]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.util.concurrent.atomic.AtomicInteger' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
源代码如下:
@Component
public class ThreadPoolExcecutorTask {
@Resource(name = "threadPoolTaskExecutor")
ThreadPoolTaskExecutor taskExecutor;
public void executorTest() {
AtomicInteger count = new AtomicInteger();
for ( int i = 0; i < 100; i++) {
count.set(i);
taskExecutor.execute(new ExecutorTestImpl(count));
}
}
}
@Component
public class ExecutorTestImpl implements Runnable {
private AtomicInteger count;
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"::"+ count);
}
public ExecutorTestImpl(AtomicInteger count) {
this.count = count;
}
}
其实此时,IDEA以已经给了提示,实现类的有参构造器count下面有红色波浪线标注。
后面查了查资料,有两套解决方案:
1、在配置中显式地定义一个
AtomicInteger
的bean。也最麻烦
@Configuration
public class AppConfig {
@Bean

public AtomicInteger atomicInteger() {
return new AtomicInteger();
}
}
2、加一上无参构造器
@Component
public class ExecutorTestImpl implements Runnable {
private AtomicInteger count;
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"::"+ count);
}
public ExecutorTestImpl(AtomicInteger count) {
this.count = count;
}
public ExecutorTestImpl() {}
}
至于为什么,度娘给的解释是:
当实体类(Entity Class)被标记为@Component时,Spring 框架会尝试将其作为组件进行管理,并创建其实例。如果实体类没有无参数构造器,Spring 将无法创建它的实例,因为 Spring 需要通过调用无参数构造器来创建对象。同时,如果实体类有带参数的构造器,并且参数不是由 Spring 管理的bean,那么在创建实体类对象时也会出现问题,因为 Spring 无法通过构造器注入依赖。
目前能力有限,具体原理以后再慢慢探知。。
热门推荐
《火影忍者》新忍者“不动”技能深度解析:比大筒木舍人更胜一筹?
九州文化在当代社会的传承及影响
紫珠盆栽的养殖方法和注意事项
11本已完结分身流小说,以化身供养本尊,厚积薄发而无敌
散打讲堂:揭秘散打灵魂腿法——前低边腿
高中各科学习方法概要,帮你们整理好了,赶快收藏!
iPhone屏幕发黄颜色异常解决方法(找回正常色彩体验)
如何正确养护仓鼠,让它们健康快乐地生活在家中
通俗正史系列之三国志·黄忠传
黄忠的长寿之谜
中草药方治疗鱼病
韦伯太空望远镜发现有史以来最古老、最遥远的黑洞
阑尾炎手术后需要禁食多久
换牙期牙膏是智商税吗?4招教你避坑!
胖东来和东方甄选的酱油,为什么都在做“0添加”?
建筑工程高级工程师职称评定条件及流程解析
馒头与米饭的升糖指数对比
五行平衡,缺土者如何选择和田玉佩戴?适合女生的翡翠和田玉对比
分手后如何应对情感波动和自我成长
童声传递 |神经纤维瘤1型患儿迎来好消息!
加速抢装!「430并网大限」引发光伏行业集体焦虑
二手房交易必看:物业交割全流程指南
美国科学家利用颈部经皮迷走神经刺激,让受试者保持34小时清醒
南开大学热门专业排名前十 南开大学最好的十大专业
脖子痛挂什么科?一文读懂就诊指南
宝宝头热怎么回事
手机充电有讲究,这样做能延长电池寿命!
心梗发作时最佳的急救方法是什么
八字命理:喜用神阴阳怎么看,八字喜什么怎么看
乐器琵琶知识全解