Bắt Đầu với Spring Boot: Dự Án Đầu Tiên

Giới Thiệu
Spring Boot là một trong những framework phổ biến nhất để xây dựng ứng dụng Java cấp doanh nghiệp. Framework này đơn giản hóa việc phát triển các ứng dụng production-ready với cấu hình tối thiểu, khiến nó trở thành lựa chọn tuyệt vời cho microservices, REST APIs và web applications.
Trong hướng dẫn toàn diện này, chúng ta sẽ tìm hiểu:
- Cài đặt Java Development Kit (JDK)
- Thiết lập công cụ phát triển
- Tạo dự án Spring Boot đầu tiên
- Hiểu cấu trúc dự án
- Xây dựng REST API đơn giản
- Chạy và test ứng dụng
- Best practices cho Spring Boot development
Yêu Cầu Trước Khi Bắt Đầu
Trước khi bắt đầu, bạn cần:
- Máy tính chạy Windows, macOS hoặc Linux
- Hiểu biết cơ bản về lập trình Java (xem Lộ Trình Học Java của chúng tôi)
- Quen thuộc với command line
- Text editor hoặc IDE
Kiến thức Java được khuyến nghị: Hoàn thành ít nhất Giai Đoạn 1: Java Fundamentals và Giai Đoạn 2: Lập Trình Hướng Đối Tượng trước khi bắt đầu với Spring Boot. Giai Đoạn 3: Core Java APIs bao gồm collections, streams và exception handling mà bạn sẽ sử dụng thường xuyên trong các dự án Spring Boot.
Bước 1: Cài Đặt Java (JDK)
Spring Boot yêu cầu Java Development Kit (JDK) phiên bản 17 trở lên. Hãy cài đặt cho hệ điều hành của bạn.
Chọn JDK Phù Hợp
Có nhiều phiên bản JDK khác nhau:
- Eclipse Temurin (trước đây là AdoptOpenJDK) - Khuyến nghị cho đa số người dùng
- Oracle JDK - Phiên bản chính thức từ Oracle
- Amazon Corretto - Phiên bản tối ưu cho AWS
- Microsoft Build of OpenJDK - Tối ưu cho Azure
Khuyến nghị: Chúng ta sẽ dùng Eclipse Temurin vì nó miễn phí, mã nguồn mở và được hỗ trợ rộng rãi.
Cài Đặt trên macOS
Cách 1: Dùng Homebrew (Khuyến nghị)
# Cài đặt Homebrew nếu chưa có
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# Cài đặt Java 21 (LTS)
brew install openjdk@21
# Thêm vào PATH
echo 'export PATH="/opt/homebrew/opt/openjdk@21/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
# Kiểm tra cài đặt
java -versionCách 2: Download từ Adoptium
- Truy cập https://adoptium.net/
- Chọn version 21 (LTS) và macOS
- Download và chạy installer
- Làm theo hướng dẫn cài đặt
Cài Đặt trên Windows
Cách 1: Dùng Chocolatey (Khuyến nghị)
# Cài đặt Chocolatey (chạy PowerShell as Administrator)
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
# Cài đặt Java 21
choco install temurin21
# Kiểm tra cài đặt
java -versionCách 2: Cài Đặt Thủ Công
- Truy cập https://adoptium.net/
- Chọn version 21 (LTS) và Windows
- Download file
.msiinstaller - Chạy installer và làm theo hướng dẫn
- Đảm bảo chọn "Set JAVA_HOME variable"
- Kiểm tra bằng cách mở Command Prompt:
java -versionCài Đặt trên Linux (Ubuntu/Debian)
# Cập nhật package index
sudo apt update
# Cài đặt Java 21
sudo apt install openjdk-21-jdk -y
# Kiểm tra cài đặt
java -version
# Kiểm tra JAVA_HOME (nên được set tự động)
echo $JAVA_HOMEVới RHEL/CentOS/Fedora:
# Cài đặt Java 21
sudo dnf install java-21-openjdk-devel -y
# Kiểm tra cài đặt
java -versionXác Nhận Java Đã Được Cài Đặt
Sau khi cài đặt, xác nhận Java đã được cài đặt đúng:
# Kiểm tra phiên bản Java
java -version
# Kết quả mong đợi (số phiên bản có thể khác):
# openjdk version "21.0.1" 2023-10-17 LTS
# OpenJDK Runtime Environment Temurin-21.0.1+12 (build 21.0.1+12-LTS)
# OpenJDK 64-Bit Server VM Temurin-21.0.1+12 (build 21.0.1+12-LTS, mixed mode)
# Kiểm tra Java compiler
javac -version
# Kiểm tra JAVA_HOME
echo $JAVA_HOME # macOS/Linux
echo %JAVA_HOME% # WindowsBước 2: Thiết Lập Công Cụ Phát Triển
Cài Đặt IDE
Mặc dù bạn có thể dùng bất kỳ text editor nào, IDE sẽ cải thiện năng suất đáng kể:
IntelliJ IDEA (Khuyến nghị)
Tốt nhất cho Spring Boot development
# macOS (dùng Homebrew)
brew install --cask intellij-idea-ce # Community Edition (Miễn phí)
# Windows (dùng Chocolatey)
choco install intellijidea-communityHoặc download từ https://www.jetbrains.com/idea/download/
Tính năng:
- Hỗ trợ Spring Boot xuất sắc
- Code completion thông minh
- Hỗ trợ Maven/Gradle tích hợp sẵn
- Debugger tích hợp
- Tích hợp Git
Visual Studio Code
Lựa chọn nhẹ hơn
# macOS
brew install --cask visual-studio-code
# Windows
choco install vscodeExtensions cần thiết:
- Extension Pack for Java
- Spring Boot Extension Pack
- Spring Initializr Java Support
Eclipse IDE
IDE Java truyền thống
Download từ https://www.eclipse.org/downloads/
Chọn "Eclipse IDE for Enterprise Java and Web Developers"
Cài Đặt Maven hoặc Gradle
Dự án Spring Boot sử dụng build tools để quản lý dependencies:
Maven (Chúng ta sẽ dùng cái này)
macOS:
brew install maven
mvn -versionWindows:
choco install maven
mvn -versionLinux:
sudo apt install maven -y
mvn -versionGradle (Lựa chọn thay thế)
# macOS
brew install gradle
# Windows
choco install gradle
# Linux
sudo apt install gradle -yBước 3: Tạo Dự Án Spring Boot Đầu Tiên
Có nhiều cách để tạo dự án Spring Boot. Hãy khám phá các phương pháp phổ biến nhất.
Cách 1: Dùng Spring Initializr (Web-based)
-
Truy cập https://start.spring.io/
-
Cấu hình dự án:
- Project: Maven
- Language: Java
- Spring Boot: 3.2.2 (hoặc phiên bản stable mới nhất)
- Group: com.example
- Artifact: demo
- Name: demo
- Package name: com.example.demo
- Packaging: Jar
- Java: 21
-
Thêm Dependencies:
- Spring Web
- Spring Boot DevTools
- Lombok (tùy chọn, để giảm boilerplate code)
-
Click "Generate" - Download file ZIP
-
Giải nén và mở:
unzip demo.zip
cd demoCách 2: Dùng Spring Boot CLI
# Cài đặt Spring Boot CLI (macOS)
brew tap spring-io/tap
brew install spring-boot
# Tạo dự án
spring init --dependencies=web,devtools --build=maven --java-version=21 demo
cd demoCách 3: Dùng IntelliJ IDEA
- Mở IntelliJ IDEA
- Click "New Project"
- Chọn "Spring Initializr" từ sidebar bên trái
- Cấu hình project settings (giống như Spring Initializr web)
- Chọn dependencies
- Click "Create"
Cách 4: Dùng Maven Archetype (Command Line)
mvn archetype:generate \
-DgroupId=com.example \
-DartifactId=demo \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DinteractiveMode=false
cd demoSau đó thêm Spring Boot dependencies vào pom.xml thủ công.
Bước 4: Hiểu Cấu Trúc Dự Án
Sau khi tạo dự án, bạn sẽ thấy cấu trúc này:
demo/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── example/
│ │ │ └── demo/
│ │ │ └── DemoApplication.java
│ │ └── resources/
│ │ ├── application.properties
│ │ ├── static/ # File tĩnh (CSS, JS, images)
│ │ └── templates/ # HTML templates (Thymeleaf)
│ └── test/
│ └── java/
│ └── com/
│ └── example/
│ └── demo/
│ └── DemoApplicationTests.java
├── target/ # Compiled classes (tự động tạo)
├── pom.xml # Cấu hình Maven
├── mvnw # Maven wrapper (Unix)
├── mvnw.cmd # Maven wrapper (Windows)
└── .gitignoreGiải Thích Các File Quan Trọng
pom.xml - Cấu Hình Maven
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- Parent POM cung cấp dependency management -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.2</version>
<relativePath/>
</parent>
<!-- Thông tin dự án -->
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<!-- Phiên bản Java -->
<properties>
<java.version>21</java.version>
</properties>
<!-- Dependencies -->
<dependencies>
<!-- Spring Web (REST APIs, MVC) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- DevTools (auto-reload khi development) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- Testing -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!-- Cấu hình build -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>DemoApplication.java - Main Application Class
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication // Kết hợp @Configuration, @EnableAutoConfiguration, @ComponentScan
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}application.properties - Cấu Hình
# Cấu hình server
server.port=8080
# Tên ứng dụng
spring.application.name=demo
# Logging level
logging.level.root=INFO
logging.level.com.example.demo=DEBUGBước 5: Xây Dựng REST API Đầu Tiên
Hãy tạo một REST API đơn giản với các thao tác CRUD.
Tạo Model Class
Tạo src/main/java/com/example/demo/model/Book.java:
package com.example.demo.model;
public class Book {
private Long id;
private String title;
private String author;
private Integer year;
// Constructors
public Book() {}
public Book(Long id, String title, String author, Integer year) {
this.id = id;
this.title = title;
this.author = author;
this.year = year;
}
// Getters và Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public Integer getYear() {
return year;
}
public void setYear(Integer year) {
this.year = year;
}
}Dùng Lombok (Tùy chọn): Nếu bạn đã thêm Lombok dependency, có thể đơn giản hóa:
package com.example.demo.model;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
@Data // Tự động tạo getters, setters, toString, equals, hashCode
@NoArgsConstructor // Constructor không tham số
@AllArgsConstructor // Constructor với tất cả tham số
public class Book {
private Long id;
private String title;
private String author;
private Integer year;
}Tạo Controller
Tạo src/main/java/com/example/demo/controller/BookController.java:
package com.example.demo.controller;
import com.example.demo.model.Book;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
@RestController // Kết hợp @Controller và @ResponseBody
@RequestMapping("/api/books") // Base URL cho tất cả endpoints
public class BookController {
// Lưu trữ trong bộ nhớ (thay bằng database trong production)
private List<Book> books = new ArrayList<>();
private Long nextId = 1L;
// Khởi tạo với dữ liệu mẫu
public BookController() {
books.add(new Book(nextId++, "Clean Code", "Robert C. Martin", 2008));
books.add(new Book(nextId++, "Effective Java", "Joshua Bloch", 2018));
}
// GET /api/books - Lấy tất cả sách
@GetMapping
public List<Book> getAllBooks() {
return books;
}
// GET /api/books/{id} - Lấy sách theo ID
@GetMapping("/{id}")
public ResponseEntity<Book> getBookById(@PathVariable Long id) {
Optional<Book> book = books.stream()
.filter(b -> b.getId().equals(id))
.findFirst();
return book.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}
// POST /api/books - Tạo sách mới
@PostMapping
public ResponseEntity<Book> createBook(@RequestBody Book book) {
book.setId(nextId++);
books.add(book);
return ResponseEntity.status(HttpStatus.CREATED).body(book);
}
// PUT /api/books/{id} - Cập nhật sách
@PutMapping("/{id}")
public ResponseEntity<Book> updateBook(@PathVariable Long id, @RequestBody Book updatedBook) {
Optional<Book> existingBook = books.stream()
.filter(b -> b.getId().equals(id))
.findFirst();
if (existingBook.isPresent()) {
Book book = existingBook.get();
book.setTitle(updatedBook.getTitle());
book.setAuthor(updatedBook.getAuthor());
book.setYear(updatedBook.getYear());
return ResponseEntity.ok(book);
}
return ResponseEntity.notFound().build();
}
// DELETE /api/books/{id} - Xóa sách
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteBook(@PathVariable Long id) {
boolean removed = books.removeIf(b -> b.getId().equals(id));
if (removed) {
return ResponseEntity.noContent().build();
}
return ResponseEntity.notFound().build();
}
}Thêm Welcome Endpoint
Tạo src/main/java/com/example/demo/controller/HomeController.java:
package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
public class HomeController {
@GetMapping("/")
public Map<String, String> home() {
Map<String, String> response = new HashMap<>();
response.put("message", "Chào mừng đến với Spring Boot API!");
response.put("version", "1.0.0");
response.put("docs", "http://localhost:8080/api/books");
return response;
}
}Bước 6: Chạy Ứng Dụng
Cách 1: Dùng Maven
# Clean và compile
./mvnw clean compile
# Chạy ứng dụng
./mvnw spring-boot:runWindows:
mvnw.cmd spring-boot:runCách 2: Dùng IDE
IntelliJ IDEA:
- Mở
DemoApplication.java - Click nút play màu xanh bên cạnh method
main() - Hoặc nhấn
Ctrl+Shift+F10(Windows/Linux) hoặcCmd+Shift+R(macOS)
VS Code:
- Mở
DemoApplication.java - Click "Run" phía trên method
main() - Hoặc dùng panel "Run and Debug"
Cách 3: Dùng JAR File
# Build JAR
./mvnw clean package
# Chạy JAR
java -jar target/demo-0.0.1-SNAPSHOT.jarKết Quả Mong Đợi
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.2.2)
2024-01-24T10:30:00.123 INFO 12345 --- [main] c.e.demo.DemoApplication: Starting DemoApplication
2024-01-24T10:30:01.456 INFO 12345 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer: Tomcat started on port(s): 8080 (http)
2024-01-24T10:30:01.789 INFO 12345 --- [main] c.e.demo.DemoApplication: Started DemoApplication in 2.1 secondsỨng dụng của bạn đang chạy tại http://localhost:8080
Bước 7: Test API
Dùng cURL
# Lấy welcome message
curl http://localhost:8080/
# Lấy tất cả sách
curl http://localhost:8080/api/books
# Lấy sách theo ID
curl http://localhost:8080/api/books/1
# Tạo sách mới
curl -X POST http://localhost:8080/api/books \
-H "Content-Type: application/json" \
-d '{"title":"Spring in Action","author":"Craig Walls","year":2022}'
# Cập nhật sách
curl -X PUT http://localhost:8080/api/books/1 \
-H "Content-Type: application/json" \
-d '{"title":"Clean Code (Updated)","author":"Robert C. Martin","year":2008}'
# Xóa sách
curl -X DELETE http://localhost:8080/api/books/1Dùng Postman
- Download Postman từ https://www.postman.com/downloads/
- Tạo request mới
- Test các endpoints:
GET http://localhost:8080/api/booksPOST http://localhost:8080/api/booksvới JSON bodyPUT http://localhost:8080/api/books/1với JSON bodyDELETE http://localhost:8080/api/books/1
Dùng Browser
Mở browser và truy cập:
Best Practices
1. Dùng Cấu Trúc Package Phù Hợp
com.example.demo/
├── controller/ # REST endpoints
├── service/ # Business logic
├── repository/ # Truy cập dữ liệu
├── model/ # Domain entities
├── dto/ # Data transfer objects
├── config/ # Configuration classes
└── exception/ # Custom exceptions2. Tách Biệt Business Logic
Tạo service layer:
package com.example.demo.service;
import com.example.demo.model.Book;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@Service
public class BookService {
// Business logic ở đây
public List<Book> findAll() { /* ... */ }
public Optional<Book> findById(Long id) { /* ... */ }
public Book save(Book book) { /* ... */ }
public void deleteById(Long id) { /* ... */ }
}3. Dùng DTOs cho API Responses
package com.example.demo.dto;
public class BookDTO {
private Long id;
private String title;
private String author;
// Chỉ những field bạn muốn expose ra API
}4. Thêm Validation
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Min;
public class Book {
@NotBlank(message = "Title không được để trống")
private String title;
@NotBlank(message = "Author không được để trống")
private String author;
@Min(value = 1000, message = "Year phải lớn hơn hoặc bằng 1000")
private Integer year;
}Thêm spring-boot-starter-validation vào pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>Dùng @Valid trong controller:
@PostMapping
public ResponseEntity<Book> createBook(@Valid @RequestBody Book book) {
// ...
}5. Thêm Exception Handling
package com.example.demo.exception;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BookNotFoundException.class)
public ResponseEntity<ErrorResponse> handleBookNotFound(BookNotFoundException ex) {
ErrorResponse error = new ErrorResponse(
HttpStatus.NOT_FOUND.value(),
ex.getMessage()
);
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(error);
}
}6. Dùng application.yml Thay Vì .properties
Tạo src/main/resources/application.yml:
server:
port: 8080
spring:
application:
name: demo
logging:
level:
root: INFO
com.example.demo: DEBUG7. Thêm API Documentation với Swagger
Thêm dependency vào pom.xml:
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.3.0</version>
</dependency>Truy cập documentation tại: http://localhost:8080/swagger-ui.html
Các Vấn Đề Thường Gặp và Giải Pháp
Vấn Đề 1: Port Đã Được Sử Dụng
Lỗi: Port 8080 was already in use
Giải pháp:
# Tìm process đang dùng port 8080 (macOS/Linux)
lsof -i :8080
# Kill process
kill -9 <PID>
# Hoặc đổi port trong application.properties
server.port=8081Vấn Đề 2: JAVA_HOME Chưa Được Set
Lỗi: JAVA_HOME not found
Giải pháp:
# macOS/Linux - Thêm vào ~/.zshrc hoặc ~/.bashrc
export JAVA_HOME=$(/usr/libexec/java_home -v 21)
# Windows - Set biến môi trường
setx JAVA_HOME "C:\Program Files\Java\jdk-21"Vấn Đề 3: Maven Build Thất Bại
Lỗi: Failed to execute goal
Giải pháp:
# Xóa Maven cache
./mvnw dependency:purge-local-repository
# Clean rebuild
./mvnw clean install -UBước Tiếp Theo
Bây giờ bạn đã có ứng dụng Spring Boot hoạt động, hãy khám phá:
- Database Integration: Thêm Spring Data JPA với PostgreSQL/MySQL
- Security: Implement authentication với Spring Security
- Testing: Viết unit và integration tests
- Caching: Thêm Redis cho hiệu suất
- Messaging: Tích hợp RabbitMQ hoặc Kafka
- Deployment: Deploy lên AWS, Azure hoặc Heroku
- Microservices: Xây dựng hệ thống phân tán với Spring Cloud
Kết Luận
Bạn đã cài đặt thành công Java, thiết lập Spring Boot và tạo REST API đầu tiên. Phương pháp convention-over-configuration của Spring Boot giúp việc xây dựng ứng dụng production-ready trở nên dễ dàng và nhanh chóng.
Các điểm chính:
- JDK 21 cung cấp các tính năng Java mới nhất
- Spring Initializr đơn giản hóa việc thiết lập dự án
- Maven quản lý dependencies hiệu quả
- @RestController tạo REST APIs với code tối thiểu
- DevTools cho phép phát triển nhanh với auto-reload
- Cấu trúc đúng giúp code dễ bảo trì
Hãy tiếp tục thực hành bằng cách xây dựng các ứng dụng phức tạp hơn, và bạn sẽ thành thạo Spring Boot trong thời gian ngắn!
Tài Liệu Tham Khảo
📬 Đăng ký nhận bản tin
Nhận những bài viết mới nhất qua email mỗi tuần. Không spam, hủy đăng ký bất cứ lúc nào.
Chúng tôi tôn trọng quyền riêng tư của bạn. Hủy đăng ký bất cứ lúc nào.
💬 Comments
Đăng nhập để bình luận
Chúng tôi sẽ không đăng bất cứ điều gì mà không có sự cho phép của bạn.