Clean • Professional
Spring Boot and the Spring Framework heavily rely on SpringFactoriesLoader to implement auto-configuration, conditional beans, and various extension points. Understanding it is crucial for grasping how Spring discovers and loads classes automatically without manual configuration.
SpringFactoriesLoader is a utility class in the Spring Framework (org.springframework.core.io.support.SpringFactoriesLoader) that:
META-INF/spring.factoriesMETA-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.importsUse Cases:
@EnableAutoConfiguration)ApplicationContextInitializer or ApplicationListener implementationsIn simple words: SpringFactoriesLoader reads configuration files from the classpath and returns a list of classes to Spring Boot dynamically.
Spring scans classpath resource files:
META-INF/spring.factories
Format Example:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
1. loadFactories(Class<T> factoryClass, ClassLoader classLoader)
publicstatic <T> List<T>loadFactories(Class<T> factoryClass, ClassLoader classLoader)
loadFactoryNames() → gets class namesList<T>2. loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader)
publicstatic List<String>loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader)
spring.factories or AutoConfiguration.imports)List<String>3. Internal Caching
Map<ClassLoader, Map<String, List<String>>> cache
4. Class Instantiation Logic
Class.forName(className, true, classLoader) to load classclazz.getDeclaredConstructor().newInstance() to instantiateBeanInstantiationException if no default constructor existsSpringApplication triggers:
List<String> candidates = SpringFactoriesLoader.loadFactoryNames(
EnableAutoConfiguration.class,
classLoader
);
AutoConfigurationImportSelector filters and imports them@Conditional annotationsApplicationContextInitializer, ApplicationListener, EnvironmentPostProcessorspring.factories or AutoConfiguration.imports to register custom auto-configurations1. Request: loadFactories(Interface.class)
2. Scan META-INF/spring.factories / AutoConfiguration.imports
3. Extract entries for requested interface
4. Remove duplicates
5. Instantiate classes via reflection
6. Return list of objects
7. Cache metadata for reuse
Integration with Spring Boot Auto-Configuration:
@SpringBootApplication
└──@EnableAutoConfiguration
└── AutoConfigurationImportSelector
└── SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration)
SpringFactoriesLoader is the backbone of Spring Boot’s plugin and auto-configuration mechanismAutoConfigurationImportSelectorSpringFactoriesLoader is the engine behind Spring Boot’s dynamic and modular architecture.
Mastering SpringFactoriesLoader gives developers deep insight into Spring Boot’s startup mechanics, auto-configuration magic, and modular plugin architecture.