Browse Source

Document placeholder and pattern support for @⁠ComponentScan

- JavaDoc: clarify that basePackages/value resolve ${…} via Environment
  and accept Ant-style package patterns (e.g., com.example.**); note
  patterns don’t apply to basePackageClasses.

- Reference: add “Property placeholders and Ant-style patterns”
  subsection in classpath-scanning.adoc with Java/Kotlin + properties
  examples.

See gh-35288
Closes gh-35491

Signed-off-by: Byeong-Uk Park <114344042+Rockernun@users.noreply.github.com>
pull/35514/head
Byeong-Uk Park 3 months ago committed by Sam Brannen
parent
commit
fe04bfcadb
  1. 39
      framework-docs/modules/ROOT/pages/core/beans/classpath-scanning.adoc
  2. 13
      spring-context/src/main/java/org/springframework/context/annotation/ComponentScan.java

39
framework-docs/modules/ROOT/pages/core/beans/classpath-scanning.adoc

@ -323,6 +323,45 @@ sure that they are 'opened' (that is, that they use an `opens` declaration inste @@ -323,6 +323,45 @@ sure that they are 'opened' (that is, that they use an `opens` declaration inste
`exports` declaration in your `module-info` descriptor).
====
==== Property placeholders and Ant-style patterns
`@ComponentScan(basePackages)` supports `${…}` property placeholders resolved
against the `Environment` and Ant-style package patterns such as `com.example.**`.
Multiple packages and/or patterns may be specified.
[tabs]
======
Java::
+
[source,java,indent=0,subs="verbatim,quotes"]
----
@Configuration
@ComponentScan(basePackages = "${app.scan.packages}")
public class AppConfig {
// ...
}
----
Kotlin::
+
[source,kotlin,indent=0,subs="verbatim,quotes"]
----
@Configuration
@ComponentScan(basePackages = ["\${app.scan.packages}"])
class AppConfig {
// ...
}
----
======
[source,properties,indent=0,subs="verbatim,quotes"]
----
app.scan.packages=com.example.**,org.acme.*
----
NOTE: Ant-style patterns do not apply to `basePackageClasses`, which accepts concrete
classes and derives packages from those classes.
Furthermore, the `AutowiredAnnotationBeanPostProcessor` and
`CommonAnnotationBeanPostProcessor` are both implicitly included when you use the
component-scan element. That means that the two components are autodetected and

13
spring-context/src/main/java/org/springframework/context/annotation/ComponentScan.java

@ -76,6 +76,10 @@ public @interface ComponentScan { @@ -76,6 +76,10 @@ public @interface ComponentScan {
* <p>Allows for more concise annotation declarations if no other attributes
* are needed &mdash; for example, {@code @ComponentScan("org.my.pkg")}
* instead of {@code @ComponentScan(basePackages = "org.my.pkg")}.
* <p>This attribute has the same semantics as {@link #basePackages}, including
* support for {@code ${...}} placeholders (resolved against the
* {@link org.springframework.core.env.Environment Environment}) and
* Ant-style package patterns (for example, {@code com.example.**}).
*/
@AliasFor("basePackages")
String[] value() default {};
@ -86,6 +90,13 @@ public @interface ComponentScan { @@ -86,6 +90,13 @@ public @interface ComponentScan {
* attribute.
* <p>Use {@link #basePackageClasses} for a type-safe alternative to
* String-based package names.
* <p>Supports {@code ${...}} placeholders resolved against the
* {@link org.springframework.core.env.Environment Environment} as well as
* Ant-style package patterns (for example, {@code com.example.**}).
* Multiple packages and/or patterns may be specified.
* <p><strong>Note:</strong> Ant-style patterns are <em>not</em> applicable to
* {@link #basePackageClasses()}, which accepts concrete classes for type-safe
* package selection.
*/
@AliasFor("value")
String[] basePackages() default {};
@ -95,6 +106,8 @@ public @interface ComponentScan { @@ -95,6 +106,8 @@ public @interface ComponentScan {
* to scan for annotated components. The package of each class specified will be scanned.
* <p>Consider creating a special no-op marker class or interface in each package
* that serves no purpose other than being referenced by this attribute.
* <p><strong>Note:</strong> Ant-style package patterns do not apply here; this
* attribute accepts concrete classes only and derives packages from those classes.
*/
Class<?>[] basePackageClasses() default {};

Loading…
Cancel
Save