Understanding @EnableAutoConfiguration Annotation in Spring Boot

Alexander Obregon
3 min readAug 18, 2023

--

Image Source

Introduction

Spring Boot, a strong framework for developing Spring applications, comes packed with a plethora of annotations to simplify the overall development process. One such noteworthy annotation is @EnableAutoConfiguration. Today, we will take a look into the wonders of this annotation, understand how it works, and learn how to effectively use it in our Spring Boot applications.

Introduction to Spring Boot Auto-configuration

Before diving into @EnableAutoConfiguration, it's essential to understand Spring Boot's Auto-configuration.

Auto-configuration is a powerful, flexible feature designed to minimize the boilerplate configuration needed to get a Spring application up and running. Spring Boot auto-configuration automatically configures your Spring application based on the jar dependencies you added in the project.

Unpacking @EnableAutoConfiguration

So, where does @EnableAutoConfiguration fit into all this?

In a nutshell, this annotation signals to Spring Boot to start adding beans based on classpath settings, other beans, and various property settings. When you use this annotation, Spring Boot attempts to auto-configure beans that you are likely to need.

Typically, you would find this annotation in your main Spring Boot application class.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;

@EnableAutoConfiguration
@ComponentScan(basePackages = "com.example.myapp")
public class MyApp {

public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
}

In the above example, @EnableAutoConfiguration is placed before the MyApp class, which is the entry point of our Spring Boot application.

How @EnableAutoConfiguration Works

Behind the scenes, @EnableAutoConfiguration leverages the Spring Factories Loader mechanism to locate and load configurations.

Spring Boot checks the classpath for META-INF/spring.factories files. Inside this file, it looks for the key org.springframework.boot.autoconfigure.EnableAutoConfiguration and gets a list of all classes under this key.

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
...

These classes are configurations that Spring Boot applies to its ApplicationContext. It’s important to note that these configurations are not applied blindly. Each auto-configuration class is equipped with conditions that decide whether it should be applied.

These conditions are typically annotated with @ConditionalOnClass, @ConditionalOnBean, @ConditionalOnMissingBean, @ConditionalOnProperty, etc. These conditions collectively define whether a certain configuration will be applied based on the presence or absence of a specific class, bean, or property.

Customizing Auto-configuration

Though auto-configuration aims to be as intelligent as possible, you might need to tweak its behavior to suit your application’s needs.

Exclude Auto-configuration Classes

One of the ways to customize the auto-configuration process is by excluding specific auto-configuration classes that you don’t want to be applied. You can do this using the exclude attribute of @EnableAutoConfiguration:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;

@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)
@ComponentScan(basePackages = "com.example.myapp")
public class MyApp {

public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
}

In this example, DataSourceAutoConfiguration will not be applied, even if it meets all other conditions.

Overriding Auto-configuration

Another way to customize is by declaring your beans, which overrides the beans defined in auto-configuration.

For instance, if you define your DataSource bean, it will override the auto-configured one.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyConfiguration {

@Bean
public DataSource dataSource() {
// return your custom datasource
}
}

Conclusion

Spring Boot’s @EnableAutoConfiguration is a powerful tool that streamlines the configuration process, enabling rapid development. This annotation intelligently auto-configures your Spring application based on your project's dependencies. However, it's crucial to understand its inner workings and customization options to maximize its potential. Although auto-configuration is an impressive feature, its efficacy is determined by how effectively it's wielded. So, embrace it, explore it, and watch it simplify your Spring Boot development journey.

  1. Spring Boot Documentation
  2. Spring Framework Reference Documentation
Spring Boot icon by Icons8

--

--

Alexander Obregon

Software Engineer, fervent coder & writer. Devoted to learning & assisting others. Connect on LinkedIn: https://www.linkedin.com/in/alexander-obregon-97849b229/