Maciej Walkowiak

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!

Help Ukraine Now!

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 @Beans 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.