Skip to content

Commit 7c13d55

Browse files
committed
Merge branch '6.1.x'
2 parents 70f3b0e + 9d9e621 commit 7c13d55

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

spring-context/src/main/java/org/springframework/scheduling/annotation/ScheduledAnnotationBeanPostProcessor.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -310,8 +310,9 @@ public Object postProcessAfterInitialization(Object bean, String beanName) {
310310
logger.trace(annotatedMethods.size() + " @Scheduled methods processed on bean '" + beanName +
311311
"': " + annotatedMethods);
312312
}
313-
if ((this.beanFactory != null && !this.beanFactory.isSingleton(beanName)) ||
314-
(this.beanFactory instanceof SingletonBeanRegistry sbr && sbr.containsSingleton(beanName))) {
313+
if ((this.beanFactory != null &&
314+
(!this.beanFactory.containsBean(beanName) || !this.beanFactory.isSingleton(beanName)) ||
315+
(this.beanFactory instanceof SingletonBeanRegistry sbr && sbr.containsSingleton(beanName)))) {
315316
// Either a prototype/scoped bean or a FactoryBean with a pre-existing managed singleton
316317
// -> trigger manual cancellation when ContextClosedEvent comes in
317318
this.manualCancellationOnContextClose.add(bean);

spring-context/src/test/java/org/springframework/scheduling/annotation/ScheduledAnnotationBeanPostProcessorTests.java

+19
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.util.List;
3030
import java.util.Map;
3131
import java.util.Properties;
32+
import java.util.Set;
3233
import java.util.concurrent.TimeUnit;
3334

3435
import org.assertj.core.api.AbstractAssert;
@@ -270,6 +271,24 @@ void oneTimeTask() {
270271
assertThat(task.getInitialDelayDuration()).isEqualTo(Duration.ofMillis(2_000L));
271272
}
272273

274+
@Test
275+
void oneTimeTaskOnNonRegisteredBean() {
276+
BeanDefinition processorDefinition = new RootBeanDefinition(ScheduledAnnotationBeanPostProcessor.class);
277+
context.registerBeanDefinition("postProcessor", processorDefinition);
278+
context.refresh();
279+
280+
ScheduledTaskHolder postProcessor = context.getBean("postProcessor", ScheduledTaskHolder.class);
281+
assertThat(postProcessor.getScheduledTasks()).hasSize(0);
282+
283+
Object target = context.getAutowireCapableBeanFactory().createBean(OneTimeTaskBean.class);
284+
assertThat(postProcessor.getScheduledTasks()).hasSize(1);
285+
@SuppressWarnings("unchecked")
286+
Set<Object> manualTasks = (Set<Object>)
287+
new DirectFieldAccessor(postProcessor).getPropertyValue("manualCancellationOnContextClose");
288+
assertThat(manualTasks).hasSize(1);
289+
assertThat(manualTasks).contains(target);
290+
}
291+
273292
@Test
274293
void cronTask() {
275294
BeanDefinition processorDefinition = new RootBeanDefinition(ScheduledAnnotationBeanPostProcessor.class);

0 commit comments

Comments
 (0)