实现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 无法通过构造器注入依赖。
目前能力有限,具体原理以后再慢慢探知。。
热门推荐
为什么特种作业人员需要进行安全技术培训考核管理?
雀舌黄杨盆景南方冬天怎么养
缺铁性贫血的主要症状和体征
Android基础架构详解
Android系统架构详解:从分层到进程视角
早上起床头晕怎么办?可能的原因及应对方法
视觉艺术中的书法应该怎么表达
如何让近视眼镜不压迫鼻梁?医生给出专业建议
海南本地人三亚旅游报团真的免费吗?附三亚旅游景点攻略与优惠政策查询
牛角挂书经典成语故事
美国学校荣誉制度的深度解析
学在北大 | 光华管理学院:因思想,而光华
新疆柯坪县开展残疾人技能培训 助力乡村振兴
中微公司去年营收增超44%:目前在研项目涵盖六类设备,超20款新设备的开发
车辆产权证是什么?如何补办?
人生规划和目标架构的关键步骤是什么?
什么是图片SEO?图片优化指南
猪骨汤食材搭配指南:这样做既美味又营养
什么是二手车验车?六大步骤助你选购放心车
传统文化中的化学
跑马拉松的好处和坏处 跑马拉松的技巧和方法
跑步比赛心理战术:从赛前焦虑到赛中心态调整的全程指导
乙肝携带者大三阳需要治疗吗
节令之美|农历十一月,代称知多少?
11月阴历黄道吉日一览 11月农历择吉日指南
小肠梗阻严重不严重怎么判断
原神多莉角色攻略:技能、命座、配队全解析
晒太阳是“最便宜”的养生方式!多晒这1个部位,比吃补药管用
访问日本时应体验的五项独特活动
381亿元!新疆这条铁路今年开建