Defensive singleton check for non-registered bean

Closes gh-33286
This commit is contained in:
Juergen Hoeller
2024-07-29 10:47:08 +02:00
parent 5aa38833dd
commit 9d9e621efe
2 changed files with 22 additions and 2 deletions

View File

@@ -30,6 +30,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.junit.jupiter.api.AfterEach;
@@ -294,6 +295,24 @@ class ScheduledAnnotationBeanPostProcessorTests {
assertThat(task.getInitialDelayDuration()).isEqualTo(Duration.ofMillis(2_000L));
}
@Test
void oneTimeTaskOnNonRegisteredBean() {
BeanDefinition processorDefinition = new RootBeanDefinition(ScheduledAnnotationBeanPostProcessor.class);
context.registerBeanDefinition("postProcessor", processorDefinition);
context.refresh();
ScheduledTaskHolder postProcessor = context.getBean("postProcessor", ScheduledTaskHolder.class);
assertThat(postProcessor.getScheduledTasks()).hasSize(0);
Object target = context.getAutowireCapableBeanFactory().createBean(OneTimeTaskBean.class);
assertThat(postProcessor.getScheduledTasks()).hasSize(1);
@SuppressWarnings("unchecked")
Set<Object> manualTasks = (Set<Object>)
new DirectFieldAccessor(postProcessor).getPropertyValue("manualCancellationOnContextClose");
assertThat(manualTasks).hasSize(1);
assertThat(manualTasks).contains(target);
}
@Test
void cronTask() {
BeanDefinition processorDefinition = new RootBeanDefinition(ScheduledAnnotationBeanPostProcessor.class);