我需要根据指定的属性或可用资源为计划任务设置线程池大小。 所以,我写了以下代码:
@EnableScheduling
@Configuration
public class TaskScheduler{
@Value("${thread.pool.size:#{Runtime.getRuntime().availableProcessors() - 1}}")
private int treadPoolSize;
@Autowired
TaskDataRepository repository;
...
}
但是,当我开始编写代码时,我得到了
2024-01-31 11:59:04.217 [元数据-DEV] [主要] [警告] o.s.c.a.AnnotationConfigApplicationContext :%PARSER_ERROR[enc] 2024-01-31 11:59:04.231 [元数据-DEV] [主要] [信息] o.s.b.a.l.ConditionEvaluationReportLogger:%PARSER_ERROR[enc] 2024-01-31 11:59:04.259 [元数据-开发] [主要] [错误] o.s.boot.SpringApplication : %PARSER_ERROR[enc] org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名称为“taskScheduler”的 bean 时出错:依赖关系不满足 通过字段“treadPoolSize”表示:表达式解析失败于 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:772) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:752) 在 org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:145)
有人可以指出我的表达有什么问题吗? 谢谢。
#{}
不能在属性占位符语法${}
中使用。然而,相反的情况也是可能的,因为 SpEL 更加复杂和强大。
@Value("#{${thread.pool.size}?:T(Runtime).getRuntime().availableProcessors() - 1}")
private int threadPoolSize;
${thread.pool.size}
- 使用占位符语法读取属性。
?:
- Elvis Operator 检查属性是否为 null 或为空。
T(Runtime).getRuntime().availableProcessors() - 1
- T 运算符 获取对 Runtime
类型的引用。