StackTips

Understanding Spring Boot Project Structure

Updated On: Sep 07, 2023

Spring Boot is an opinionated framework and it comes with a default project structure that organizes your code based on some of the industry's best practices.

In the previous chapter, we created a Spring boot project using the Spring CLI and the Spring initializer. In both cases, we have used the same configuration for generating our project.

Now let us unzip the project, and open it in the IntelliJ IDE. After unzipping the project, you’ll see a project structure similar to what is shown in the following picture;

movies-api
├── HELP.md
├── build
│   └── libs
│       ├── movies-api-0.0.1-SNAPSHOT-plain.jar
│       └── movies-api-0.0.1-SNAPSHOT.jar
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── stacktips
    │   │           └── app
    │   │               └── MoviesApiApplication.java
    │   └── resources
    │       ├── application.properties
    │       ├── static
    │       └── templates
    └── test
        └── java
            └── com
                └── stacktips
                    └── app
                        └── MoviesApiApplicationTests.java

A typical Spring Boot project includes the following folders and files.

pom.xml (Maven) or build.gradle (Gradle)

You will either have a pom.xml file or build.gradle file based on the build tool used for your project. This file defines the project metadata, and dependencies for your project and contains the project build configurations.

While generating this project we have selected Gradle as the build tool, hence we see build.gradle file in the root directory.

The src/main/java Directory

The src/main/java directory contains the Java source code files for your project. It follows the standard Java packaging structure, where the root package is called as the base package.

The src/test/java Directory

This directory contains the unit and integration test classes for your project.

The build Directory

This directory is automatically generated by Maven (or Gradle) and contains the compiled Java classes, JAR files, and other build artifacts. We don't need to manually modify anything in this directory.

If your source code is tracked in git, this directory is generally not tracked and added to the .gitignore file.

The Main Application Class

The MoviesAPIApplication class is the entry point of your Spring Boot application and contains a main() method. It is responsible for initializing the Spring application context and starting the Spring application.

This class is annotated with @SpringBootApplication annotation.

The @SpringBootApplication annotation is a convenience annotation that combines 3 other Spring Boot annotations.

  • The @EnableAutoConfiguration enables Spring Boot's auto-configuration mechanism, which automatically configures many common Spring beans based on the dependencies that are present in the classpath.
  • The @Configuration annotation indicates that the class contains one or more bean definitions containing @Bean annotations.
  • The @ComponentScan annotation scans the classpath for classes annotated with @Component, @Service, @Repository, or @Configuration annotations. Classes that are registered with any of the 4 annotations are registered as beans in the Spring application context.

The inner workings of Dependency Injection in Spring Boot are discussed at length in Chapter 4.

By using the @SpringBootApplication annotation, you can simplify the configuration of your Spring Boot application as you don't need to declare the @Configuration, @EnableAutoConfiguration, and @ComponentScan annotations separately.

@SpringBootApplication
public class HelloSpringBootApplication {

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

The src/main/resources directory

The resources directory is for non-Java resources that your application needs, such as configuration files, static assets (e.g., HTML, CSS, JavaScript), templates, and other resources.

The Application Properties Class

The application.properties file contains the configurations for your Spring Boot applications. It is located in the src/main/resources directory. The properties file contains key-value pairs separated by equals =, where the key is the name of the property and the value is the value of the property.

The application.properties file contains all the configurations such as:

  • Configuring the server port that the application should run
  • The database connection-related configuration such as database URL, username, and password
  • SMTP email server settings
  • To set the log levels
server.port=8080
server.contextPath=/

spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
spring.datasource.password=root
spring.datasource.username=admin
spring.datasource.type=mysql

During the Spring boot context initialization, the properties defined in the application.properties file are used to conditionally create or configure Spring beans.

Static Content

The resources/static folder is dedicated to all the static resources, templates, and property files. This folder contains static resources such as CSS, JS, and images.

resources/templates

The resources/templates directory serves as the default location for storing the server-side view templates that are used for rendering dynamic content on web pages. These templates are processed by a templating engine to generate the final HTML output before sending a response to the browser.

Spring Boot supports the following template engines by default.

  • Thymeleaf: This is the default template engine used in Spring Boot and activated using spring-boot-starter-thymeleaf starter dependency.
  • FreeMarker: FreeMarker is another popular option and can be activated using spring-boot-starter-freemarker starter dependency.
  • Mustache: A logic-less templating engine focusing on simplicity and separation of concerns. activated using spring-boot-starter-mustache starter dependency.

All these template engines automatically resolve the template files from the /resources/template directory automatically.