Spring Boot AutoConfigure provides auto-configuration capabilities that automatically configure Spring applications based on jar dependencies present on the classpath
—
Spring Boot AutoConfigure provides configuration support for Spring Data repositories with type-based conditional registration and base package management. This enables automatic configuration of JPA, MongoDB, Redis, and other Spring Data repositories.
import org.springframework.boot.autoconfigure.data.*;
import org.springframework.data.repository.config.BootstrapMode;
import org.springframework.data.util.Streamable;Conditional annotation that matches when a particular type of Spring Data repository has been enabled.
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnRepositoryTypeCondition.class)
public @interface ConditionalOnRepositoryType {
/**
* The data store type (e.g., JDBC, JPA, MongoDB, Redis).
* Use RepositoryType.AUTO to automatically detect based on available dependencies.
*
* @return data store type (never null)
*/
RepositoryType store();
/**
* The repository type (imperative, reactive, or auto-detect).
* Use RepositoryType.IMPERATIVE for traditional blocking repositories.
* Use RepositoryType.REACTIVE for non-blocking reactive repositories.
* Use RepositoryType.AUTO to auto-detect based on classpath.
*
* @return repository implementation type (never null)
*/
RepositoryType type();
}Enum defining types of Spring Data repositories to enable.
public enum RepositoryType {
/**
* Automatically detect repository type based on dependencies.
*/
AUTO,
/**
* Traditional blocking/imperative repositories.
*/
IMPERATIVE,
/**
* Reactive non-blocking repositories.
*/
REACTIVE,
/**
* No repositories should be enabled.
*/
NONE
}Abstract base class for ImportBeanDefinitionRegistrar implementations that provide repository configuration support.
public abstract class AbstractRepositoryConfigurationSourceSupport
implements ImportBeanDefinitionRegistrar,
BeanFactoryAware,
ResourceLoaderAware,
EnvironmentAware {
/**
* Register bean definitions with optional custom bean name generator.
*/
public void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata,
BeanDefinitionRegistry registry,
BeanNameGenerator importBeanNameGenerator
);
/**
* Register bean definitions.
*/
public void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata,
BeanDefinitionRegistry registry
);
/**
* Set the resource loader.
*/
public void setResourceLoader(ResourceLoader resourceLoader);
/**
* Set the bean factory.
*/
public void setBeanFactory(BeanFactory beanFactory);
/**
* Set the environment.
*/
public void setEnvironment(Environment environment);
/**
* Get the base packages to scan for repositories.
* Subclasses must implement this method to specify which packages contain repositories.
* These packages and their sub-packages will be scanned for repository interfaces.
*
* @return streamable of base package names (never null, may be empty)
*/
public Streamable<String> getBasePackages();
/**
* Get the bootstrap mode for repository initialization.
* Subclasses must implement this method to control when repositories are initialized.
*
* Bootstrap modes:
* - DEFAULT: Eager initialization of repositories at startup
* - LAZY: Lazy initialization on first use (faster startup)
* - DEFERRED: Background initialization (fastest startup)
*
* @return the bootstrap mode (never null, default: BootstrapMode.DEFAULT)
*/
public BootstrapMode getBootstrapMode();
}# JPA Repository Configuration
spring:
data:
jpa:
repositories:
enabled: true
bootstrap-mode: default # or 'lazy', 'deferred'
# MongoDB Repository Configuration
spring:
data:
mongodb:
repositories:
type: auto # or 'imperative', 'reactive', 'none'import org.springframework.boot.autoconfigure.data.AbstractRepositoryConfigurationSourceSupport;
import org.springframework.data.repository.config.BootstrapMode;
import org.springframework.data.repository.config.RepositoryConfigurationDelegate;
import org.springframework.data.util.Streamable;
public class CustomRepositoryConfigurationSourceSupport
extends AbstractRepositoryConfigurationSourceSupport {
@Override
public Streamable<String> getBasePackages() {
// Return base packages to scan
return Streamable.of(
"com.example.repositories",
"com.example.data"
);
}
@Override
public BootstrapMode getBootstrapMode() {
// Return bootstrap mode for repository initialization
return BootstrapMode.DEFAULT;
}
@Override
protected RepositoryConfigurationDelegate createDelegate(
AnnotationMetadata metadata,
BeanDefinitionRegistry registry) {
// Implement configuration delegate creation
return super.createDelegate(metadata, registry);
}
}import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.data.ConditionalOnRepositoryType;
import org.springframework.boot.autoconfigure.data.RepositoryType;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@AutoConfiguration
@ConditionalOnClass(JpaRepository.class)
@ConditionalOnRepositoryType(
store = RepositoryType.AUTO,
type = RepositoryType.IMPERATIVE
)
public class CustomJpaRepositoriesAutoConfiguration {
@Configuration
@EnableJpaRepositories(basePackages = "com.example.repositories")
static class JpaRepositoriesConfiguration {
// JPA repositories configuration
}
}import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.data.ConditionalOnRepositoryType;
import org.springframework.boot.autoconfigure.data.RepositoryType;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
import org.springframework.data.mongodb.repository.config.EnableReactiveMongoRepositories;
@AutoConfiguration
@ConditionalOnClass(ReactiveMongoRepository.class)
@ConditionalOnRepositoryType(
store = RepositoryType.AUTO,
type = RepositoryType.REACTIVE
)
public class ReactiveMongoRepositoriesAutoConfiguration {
@Configuration
@EnableReactiveMongoRepositories(
basePackages = "com.example.repositories.reactive"
)
static class ReactiveRepositoriesConfiguration {
// Reactive MongoDB repositories configuration
}
}import org.springframework.boot.autoconfigure.data.AbstractRepositoryConfigurationSourceSupport;
import org.springframework.data.repository.config.BootstrapMode;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties("spring.data.custom")
public class CustomRepositoryProperties {
private BootstrapMode bootstrapMode = BootstrapMode.DEFAULT;
public BootstrapMode getBootstrapMode() {
return bootstrapMode;
}
public void setBootstrapMode(BootstrapMode bootstrapMode) {
this.bootstrapMode = bootstrapMode;
}
}
public class CustomRepositoryConfiguration
extends AbstractRepositoryConfigurationSourceSupport {
private final CustomRepositoryProperties properties;
public CustomRepositoryConfiguration(CustomRepositoryProperties properties) {
this.properties = properties;
}
@Override
public BootstrapMode getBootstrapMode() {
return properties.getBootstrapMode();
}
@Override
public Streamable<String> getBasePackages() {
return Streamable.of("com.example.repositories");
}
}import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.data.ConditionalOnRepositoryType;
import org.springframework.boot.autoconfigure.data.RepositoryType;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
@AutoConfiguration
public class MultiStoreRepositoriesAutoConfiguration {
@Configuration
@ConditionalOnRepositoryType(
store = RepositoryType.AUTO,
type = RepositoryType.IMPERATIVE
)
@EnableJpaRepositories(
basePackages = "com.example.repositories.jpa",
entityManagerFactoryRef = "entityManagerFactory",
transactionManagerRef = "transactionManager"
)
static class JpaRepositoriesConfiguration {
}
@Configuration
@ConditionalOnRepositoryType(
store = RepositoryType.AUTO,
type = RepositoryType.IMPERATIVE
)
@EnableMongoRepositories(
basePackages = "com.example.repositories.mongo",
mongoTemplateRef = "mongoTemplate"
)
static class MongoRepositoriesConfiguration {
}
}DEFERRED or LAZY for faster application startupConditionalOnRepositoryType for type-safe repository detection