DEV Community

DevCorner
DevCorner

Posted on

Spring Boot Internals: A Deep Dive

Spring Boot is a powerful framework that simplifies Java application development by providing built-in configurations and conventions. Understanding its internals can help developers make better use of its features and optimize performance. In this blog, we will explore:

  • Spring Boot Auto-Configuration
  • Spring Boot Starters
  • Spring Boot Actuator
  • Exception Handling in Spring Boot
  • Spring Boot Profiles

1. Spring Boot Auto-Configuration

What is Auto-Configuration?
Spring Boot's auto-configuration feature automatically configures your application based on the dependencies present in the classpath. This eliminates the need for manual configuration.

How does it work?

  • Uses @EnableAutoConfiguration annotation.
  • Leverages spring.factories to load configuration classes.
  • Provides sensible defaults while allowing customization.

Example:

@SpringBootApplication
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}
Enter fullscreen mode Exit fullscreen mode

Spring Boot detects dependencies like spring-boot-starter-web and auto-configures a web application.


2. Spring Boot Starters

Spring Boot Starters are pre-configured dependency bundles that simplify dependency management.

Common Starters:

  • spring-boot-starter-web → For building web applications.
  • spring-boot-starter-data-jpa → For working with JPA and Hibernate.
  • spring-boot-starter-security → For adding security features.

Example: Adding a starter in pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
Enter fullscreen mode Exit fullscreen mode

3. Spring Boot Actuator

Spring Boot Actuator provides monitoring and management endpoints to gain insights into the application’s health and metrics.

How to Enable Actuator?
Add the dependency:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Enter fullscreen mode Exit fullscreen mode

Enable endpoints in application.properties:

management.endpoints.web.exposure.include=health,info,metrics
Enter fullscreen mode Exit fullscreen mode

Access the health endpoint:

http://localhost:8080/actuator/health
Enter fullscreen mode Exit fullscreen mode

4. Exception Handling in Spring Boot

Spring Boot provides multiple ways to handle exceptions:

Using @ExceptionHandler in Controller

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleException(Exception e) {
        return new ResponseEntity<>("Error: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}
Enter fullscreen mode Exit fullscreen mode

Using @ResponseStatus

@ResponseStatus(HttpStatus.NOT_FOUND)
class ResourceNotFoundException extends RuntimeException {
    public ResourceNotFoundException(String message) {
        super(message);
    }
}
Enter fullscreen mode Exit fullscreen mode

5. Spring Boot Profiles

Spring Boot Profiles provide a way to define different configurations for different environments (development, testing, production, etc.). This helps in managing environment-specific settings efficiently without modifying the core application code.

Why Use Spring Boot Profiles?

  • Keep environment-specific configurations separate.
  • Avoid hardcoding environment values in the main configuration.
  • Enable or disable beans based on the active profile.

Defining Profiles in application.properties or application.yml

In application.properties:

spring.profiles.active=dev
Enter fullscreen mode Exit fullscreen mode

Or in application.yml:

spring:
  profiles:
    active: dev
Enter fullscreen mode Exit fullscreen mode

Creating Profile-Specific Configuration Files

Spring Boot allows you to create separate configuration files for each environment:

  • application-dev.properties
  • application-test.properties
  • application-prod.properties

For example, in application-dev.properties:

server.port=8081
datasource.url=jdbc:mysql://localhost:3306/dev_db
datasource.username=dev_user
datasource.password=dev_pass
Enter fullscreen mode Exit fullscreen mode

In application-prod.properties:

server.port=8080
datasource.url=jdbc:mysql://prod-db-host:3306/prod_db
datasource.username=prod_user
datasource.password=prod_pass
Enter fullscreen mode Exit fullscreen mode

Using @Profile Annotation in Java Classes

You can also define beans that should only be loaded for a specific profile using the @Profile annotation.

Example:

@Component
@Profile("dev")
public class DevConfig {
    public DevConfig() {
        System.out.println("Development profile active");
    }
}
Enter fullscreen mode Exit fullscreen mode

Another example for a production-specific bean:

@Component
@Profile("prod")
public class ProdConfig {
    public ProdConfig() {
        System.out.println("Production profile active");
    }
}
Enter fullscreen mode Exit fullscreen mode

Overriding Profiles in the Command Line

You can override the active profile at runtime using:

java -jar myapp.jar --spring.profiles.active=prod
Enter fullscreen mode Exit fullscreen mode

Activating Multiple Profiles

You can enable multiple profiles by separating them with commas:

spring.profiles.active=dev,test
Enter fullscreen mode Exit fullscreen mode

Checking Active Profiles in Code

You can programmatically check which profiles are active:

@Autowired
private Environment environment;

public void checkActiveProfiles() {
    String[] activeProfiles = environment.getActiveProfiles();
    System.out.println("Active profiles: " + Arrays.toString(activeProfiles));
}
Enter fullscreen mode Exit fullscreen mode

Conclusion

Spring Boot provides powerful features like auto-configuration, starters, Actuator, exception handling, and profiles to make application development easy. Understanding these internals helps developers build robust and scalable applications efficiently.

Have any questions? Drop a comment below! 🚀

Top comments (0)