Spring's @ComponentScan offers a type-safe basePackageClasses
attribute - seems a good thing to use especially as it isn't uncommon for packages to be renamed on the project I'm working on. The documentation says:
Consider creating a special no-op marker class or interface in each package that serves no purpose other than being referenced by this attribute.
... but offers no further guidance on the name of such a class. Am wondering if there are any conventions around this. package-info.java
already exists in all packages (as enforced by Checkstyle) - would have preferred to reuse this but sadly Java doesn't allow a class of this name.
(If no such standards exist am thinking perhaps PackageInfo
, BasePackage
, PackageMarker
or similar but would prefer to follow convention if there is one.)
The basePackageClasses attribute is the type-safe alternative to basePackages() in order to specify the packages to scan for the annotated components. The package of each specified class will be scanned. This will ensure that even when the package is renamed or moved, the component scan would work as expected.
@Component and @ComponentScan are for different purposes. @Component indicates that a class might be a candidate for creating a bean. It's like putting a hand up. @ComponentScan is searching packages for Components.
The @ComponentScan annotation is used with the @Configuration annotation to tell Spring the packages to scan for annotated components. @ComponentScan also used to specify base packages and base package classes using thebasePackageClasses or basePackages attributes of @ComponentScan.
One of the most important annotations in spring is @ComponentScan which is used along with the @Configuration annotation to specify the packages that we want to be scanned. @ComponentScan without arguments tells Spring to scan the current package and all of its sub-packages.
No answers yet and had to make a decision so here it is:
Marker class:
package com.companyname.appname.projectname.package1name;
/**
* Empty marker class used to identify this package when using type-safe basePackageClasses in Spring @ComponentScan.
*/
public class PackageMarker {
// Empty marker class
}
Usage:
@ComponentScan(basePackageClasses = {
com.companyname.appname.projectname.package1name.PackageMarker.class,
com.companyname.appname.projectname.package2name.PackageMarker.class,
/* ...etc... */
})
PackageMarker
naming justification:
Would still be interested if anyone can give examples of marker classes used in a more trail-blazing context...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With