From 819a7c86c194976622e0d035e1f5931aa9db4312 Mon Sep 17 00:00:00 2001 From: Sam Brannen <104798+sbrannen@users.noreply.github.com> Date: Wed, 5 Feb 2025 13:39:29 +0100 Subject: [PATCH] =?UTF-8?q?Clarify=20component=20scanning=20of=20abstract?= =?UTF-8?q?=20classes=20with=20@=E2=81=A0Lookup=20methods?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Due to changes in gh-19118, classes that contain @⁠Lookup methods are no longer required to be concrete classes for use with component scanning; however, the reference documentation still states that such classes must not be abstract. This commit therefore removes the outdated reference documentation and updates the corresponding Javadoc. See gh-19118 Closes gh-34367 --- .../beans/dependencies/factory-method-injection.adoc | 7 ------- .../ClassPathScanningCandidateComponentProvider.java | 9 +++++---- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/framework-docs/modules/ROOT/pages/core/beans/dependencies/factory-method-injection.adoc b/framework-docs/modules/ROOT/pages/core/beans/dependencies/factory-method-injection.adoc index 6cfb9e5c9aa..a8096c29972 100644 --- a/framework-docs/modules/ROOT/pages/core/beans/dependencies/factory-method-injection.adoc +++ b/framework-docs/modules/ROOT/pages/core/beans/dependencies/factory-method-injection.adoc @@ -120,8 +120,6 @@ dynamically generate a subclass that overrides the method. subclasses cannot be `final`, and the method to be overridden cannot be `final`, either. * Unit-testing a class that has an `abstract` method requires you to subclass the class yourself and to supply a stub implementation of the `abstract` method. -* Concrete methods are also necessary for component scanning, which requires concrete - classes to pick up. * A further key limitation is that lookup methods do not work with factory methods and in particular not with `@Bean` methods in configuration classes, since, in that case, the container is not in charge of creating the instance and therefore cannot create @@ -293,11 +291,6 @@ Kotlin:: ---- ====== -Note that you should typically declare such annotated lookup methods with a concrete -stub implementation, in order for them to be compatible with Spring's component -scanning rules where abstract classes get ignored by default. This limitation does not -apply to explicitly registered or explicitly imported bean classes. - [TIP] ==== Another way of accessing differently scoped target beans is an `ObjectFactory`/ diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ClassPathScanningCandidateComponentProvider.java b/spring-context/src/main/java/org/springframework/context/annotation/ClassPathScanningCandidateComponentProvider.java index daeb1cd833e..cde1b3d8dbc 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ClassPathScanningCandidateComponentProvider.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ClassPathScanningCandidateComponentProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2023 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -565,9 +565,10 @@ public class ClassPathScanningCandidateComponentProvider implements EnvironmentC } /** - * Determine whether the given bean definition qualifies as candidate. - *

The default implementation checks whether the class is not an interface - * and not dependent on an enclosing class. + * Determine whether the given bean definition qualifies as a candidate component. + *

The default implementation checks whether the class is not dependent on an + * enclosing class as well as whether the class is either concrete (and therefore + * not an interface) or has {@link Lookup @Lookup} methods. *

Can be overridden in subclasses. * @param beanDefinition the bean definition to check * @return whether the bean definition qualifies as a candidate component