-
Notifications
You must be signed in to change notification settings - Fork 38.8k
Closed
Labels
in: coreIssues in core modules (aop, beans, core, context, expression)Issues in core modules (aop, beans, core, context, expression)type: bugA general bugA general bug
Milestone
Description
Affects: 5.3.3
We use an AsyncConfigurer that needs some beans. Spring wants to create a BeanPostProcessor asyncAdvisor at
org.springframework.scheduling.annotation.ProxyAsyncConfiguration. This bean post processor uses the instance variables this.executor and this.exceptionHandler
all AsyncConfigurer are autowired to ProxyAsyncConfiguration via the following method
org.springframework.scheduling.annotation.AbstractAsyncConfiguration
@Autowired(required = false)
void setConfigurers(Collection<AsyncConfigurer> configurers) {
if (CollectionUtils.isEmpty(configurers)) {
return;
}
if (configurers.size() > 1) {
throw new IllegalStateException("Only one AsyncConfigurer may exist");
}
AsyncConfigurer configurer = configurers.iterator().next();
this.executor = configurer::getAsyncExecutor;
this.exceptionHandler = configurer::getAsyncUncaughtExceptionHandler;
}
This leads to a prelimary instance creation of all asyncConfigurer and its dependent beans.
IMHO this should be changed to use an ObjectProvider instead:
protected ObjectProvider<AsyncConfigurer> configurersProvider;
@Autowired(required = false)
void setConfigurers(ObjectProvider<AsyncConfigurer> configurers) {
this.configurersProvider = configurers;
}
protected void evaluateAsyncConfigurer() {
List<AsyncConfigurer> configurers = configurersProvider.orderedStream().collect(Collectors.toList());
if (CollectionUtils.isEmpty(configurers)) {
return;
}
if (configurers.size() > 1) {
throw new IllegalStateException("Only one AsyncConfigurer may exist");
}
AsyncConfigurer configurer = configurers.iterator().next();
this.executor = configurer::getAsyncExecutor;
this.exceptionHandler = configurer::getAsyncUncaughtExceptionHandler;
}
method evaluateAsyncConfigurer() should be called before access to this.executor and this.exceptionHandler in child classes.
Metadata
Metadata
Assignees
Labels
in: coreIssues in core modules (aop, beans, core, context, expression)Issues in core modules (aop, beans, core, context, expression)type: bugA general bugA general bug