Ensure that parameter resolution in SpringExtension is thread-safe
Prior to this commit, parallel execution of @BeforeEach and @AfterEach methods that accepted @Autowired arguments would fail intermittently due to a race condition in the internal implementation of the JDK's java.lang.reflect.Executable.getParameters() method. This commit addresses this issue by creating instances of SynthesizingMethodParameter via SynthesizingMethodParameter.forExecutable(Executable, int) instead of SynthesizingMethodParameter.forParameter(Parameter), since the latter looks up the parameter index by iterating over the array returned by Executable.getParameters() (which is not thread-safe). Issue: SPR-17533
This commit is contained in:
@@ -118,7 +118,8 @@ abstract class ParameterAutowireUtils {
|
|||||||
Autowired autowired = AnnotatedElementUtils.findMergedAnnotation(annotatedParameter, Autowired.class);
|
Autowired autowired = AnnotatedElementUtils.findMergedAnnotation(annotatedParameter, Autowired.class);
|
||||||
boolean required = (autowired == null || autowired.required());
|
boolean required = (autowired == null || autowired.required());
|
||||||
|
|
||||||
MethodParameter methodParameter = SynthesizingMethodParameter.forParameter(parameter);
|
MethodParameter methodParameter = SynthesizingMethodParameter.forExecutable(
|
||||||
|
parameter.getDeclaringExecutable(), parameterIndex);
|
||||||
DependencyDescriptor descriptor = new DependencyDescriptor(methodParameter, required);
|
DependencyDescriptor descriptor = new DependencyDescriptor(methodParameter, required);
|
||||||
descriptor.setContainingClass(containingClass);
|
descriptor.setContainingClass(containingClass);
|
||||||
return applicationContext.getAutowireCapableBeanFactory().resolveDependency(descriptor, null);
|
return applicationContext.getAutowireCapableBeanFactory().resolveDependency(descriptor, null);
|
||||||
|
|||||||
Reference in New Issue
Block a user