Spring Boot component scanning without annotations
Russia has invaded Ukraine and already killed tens of thousands of civilians, with many more raped and tortured. Ukraine needs your help!
Spring Boot has an interesting capability that I haven't discovered till very recently when going through Spring Cloud Function
project source code - it can scan for components - meaning go through classpath to find beans - even for classes that are not
annotated with any of the Spring stereotype annotations like @Component
, @Service
, @Repository
, @Controller
or @Configuration
.
@ComponentScan
annotation - that can be placed on any @Configuration
class (including the
main @SpringBootApplication
annotated class) - can be configured with a filter that instead of looking for typical Spring
annotations, looks for specific Java types.
In the following example, Spring will scan for components in package functions
that implement java.util.Function
interface:
@SpringBootApplication
@ComponentScan(
basePackages = "functions",
includeFilters = @ComponentScan.Filter(
type = FilterType.ASSIGNABLE_TYPE,
classes = Function.class
)
)
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
}
Such configuration make it possible to scan for classes from a Spring unaware 3rd party jar
without defining beans
with @Bean
annotation.
Or it can save you from defining @Bean
s in configuration classes in case you want to keep your beans free from Spring classes
or annotations.
Spring Cloud Function gives you exactly this option - you can define classes of type Function
, Supplier
or Consumer
in
a functions
package, without annotating them with Spring annotations, and they will be registered as beans in the container.
While it is not useful in the great majority of regular applications I find it quite interesting and potentially useful when developing something more advanced or less typical than regular Spring Boot application.