实现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 无法通过构造器注入依赖。
目前能力有限,具体原理以后再慢慢探知。。
热门推荐
期待也能变成一种微妙的暴力?
从木浆到废纸浆:中国纸浆行业的绿色转型之路
“悟空”火爆,带来网吧新变化
现代艺术设计中剪纸艺术的应用论文
【AI系统】知识蒸馏原理
干细胞与生物3D打印:未来医疗的新融合应用
深入剖析Matlab BPSK信道编码技术:汉明码、循环码、卷积码全面解析与应用
t要结婚了:法律视角下的婚姻缔结与权利义务
量比指标的定义是什么?量比指标在股票交易中的实际应用有哪些?
合同起诉管辖权的规定有哪些
如何操作国债以优化投资组合?这些操作策略有哪些风险和策略?
AI写作查重率怎么降低:探索七大策略
一座商丘城,半部中国史
探索商丘:位置、历史与现代发展全解析
司法冻结银行卡需要多久才解除?
车用铝型材:驶向未来市场的增长引擎
如何监控理财产品收益
如何准确计算贷款余额以规划财务?这种计算方法在不同贷款产品中如何应用?
如何挖矿比特币?比特币挖矿设置、成本和要点指南
40岁+女性注意,这些表现可能是进入更年期的信号
在中国最早王朝时期探寻中医足迹
导热系数测试指南:稳态法与瞬态法的全面解析
左手前端无力如何锻炼
价格变动如何进行合理分析?这种分析怎样辅助决策?
“秀才”在如今相当于啥学历?明明地位很高,别再被电视剧骗了!
睡不着脑子里胡思乱想?这些原因和对策帮你改善睡眠
静态拉伸和动态拉伸傻傻分不清?一文详解三种拉伸方法
33家A股上市公司发布估值提升计划 现金分红、并购重组成关键词
债权转让合同管辖法院的确定:法律适用与实践探讨
科创板开板五周年,“硬科技”定位越来越清晰