Spring Boot - Một số Annotation - Phần 1
Spring Boot đã trở thành một trong những framework phổ biến nhất việc phát triển ứng dụng Java. Điểm nổi bật của nó chính là cách quản lý các annotation để đơn giản hóa quá trình lập trình. Không cần phải nhớ quá nhiều lệnh cấu hình, chỉ cần "gắn nhãn" đúng chỗ là xong. Giống như việc dán nhãn lên hộp đồ trong nhà bếp vậy!
Trong bài viết này, chúng ta sẽ cùng nhau khám phá những annotation thông dụng nhất của Spring Boot, với các ví dụ cụ thể và hi vọng là dễ hiểu :)))
Nàooo ! Tắt cái màn hình Connan thám tử lừng danh hay mấy MV KPOP đi, chuẩn bị bịch bánh tráng trộn và một ly nước ép để bắt đầu đọc thoaiii :D
1. @SpringBootApplication
Đây chính là trái tim của Spring Boot. Khi dán nhãn @SpringBootApplication lên class, như đang nói với Spring rằng: “Hey! Đây là ứng dụng Spring Boot của tôi. Hãy bắt đầu chạy thôi!”
Cách hoạt động:
@SpringBootApplication thực ra là một “combo” của ba annotation:
@Configuration: Định nghĩa class được đánh dấu là nơi cung cấp các cấu hình của Spring.@EnableAutoConfiguration: Tự động cấu hình Spring dựa trên các thư viện trong classpath.@ComponentScan: Tự động quét các package để tìm và khởi tạo các bean để đưa vào container.
1
2
3
4
5
6
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
Hãy tưởng tượng @SpringBootApplication là một ông quản lý sự kiện. Ông ta biết mọi thứ cần phải làm để sự kiện (ứng dụng) của bạn chạy trơn tru. Bạn chỉ cần bảo ông ta “Chạy thôi!” và tất cả sẽ được lo liệu!
2. @RestController
@RestController kết hợp hai annotation khác là @Controller và @ResponseBody. Annotation này được sử dụng để định nghĩa một controller, đồng thời đảm bảo rằng kết quả trả về sẽ được ghi trực tiếp vào response body thay vì phải qua một bước trung gian để render view.
1
2
3
4
5
6
7
8
@RestController
public class HelloController {
@GetMapping("/hello")
public String sayHello() {
return "Hello, Spring Boot!";
}
}
@RestController giống như một anh bồi bàn. Bạn gọi món và anh ấy mang thức ăn ra mà không cần phải trang trí cầu kỳ, chỉ cần món ăn nhanh và nóng hổi vừa thổi vừa ăn là được.
3. @RequestMapping
Annotation này được dùng để ánh xạ các request HTTP đến các phương thức xử lý trong controller. Các biến thể phổ biến là:
- @GetMapping
- @PostMapping
- @PutMapping
- @DeleteMapping
1
2
3
4
5
6
7
8
9
10
11
12
13
@RestController
public class ProductController {
@GetMapping("/products")
public List<Product> getAllProducts() {
return productService.getAllProducts();
}
@PostMapping("/products")
public Product createProduct(@RequestBody Product product) {
return productService.saveProduct(product);
}
}
@RequestMapping và đồng bọn giống như GPS cho ứng dụng của bạn. Mỗi khi có ai đó hỏi đường (gửi HTTP request), họ sẽ chỉ lối để người đó đi đúng đến phương thức xử lý.
4. @Autowired
Annotation này là một trong những phép màu của Spring Boot. Nó giúp tự động tiêm các phụ thuộc (dependency injection) vào các class mà không cần bạn phải làm điều gì đặc biệt. Chỉ cần nói với Spring rằng: “Tôi cần cái này”, và Spring sẽ lấy nó từ container và đưa tận tay cho bạn.
1
2
3
4
5
6
7
8
9
10
@Service
public class ProductService {
@Autowired
private ProductRepository productRepository;
public List<Product> getAllProducts() {
return productRepository.findAll();
}
}
Hãy tưởng tượng @Autowired giống như trợ lý cá nhân. Chỉ cần bảo: “Lấy cho tôi cái productRepository”, và nó sẽ làm ngay mà không phàn nàn.
5. @Service, @Repository, @Component
Đây là ba annotation thường được dùng để đăng ký các bean với Spring container. Chúng giúp Spring biết những class nào cần quản lý và khởi tạo trong lúc chạy ứng dụng.
@Service: Đánh dấu class là một service - nơi xử lý các logic.@Repository: Đánh dấu class là một repository (thường dùng cho DAO - Data Access Object).@Component: Đánh dấu một component tổng quát.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Service
public class OrderService {
// logic xử lý order
}
@Repository
public class OrderRepository {
// logic thao tác với database
}
@Component
public class OrderHandler {
// logic xử lý các order
}
@Service, @Repository, và @Component giống như những người bạn của bạn trong một đội. Mỗi người đều có nhiệm vụ riêng, nhưng tất cả đều cùng góp sức để giúp dự án chạy mượt mà.
6. @PathVariable và @RequestParam
@PathVariable: Được dùng để lấy giá trị từ đường dẫn URL.
@RequestParam: Được dùng để lấy giá trị từ query parameters của URL.
1
2
3
4
5
6
7
8
9
10
11
12
13
@RestController
public class UserController {
@GetMapping("/users/{id}")
public User getUserById(@PathVariable Long id) {
return userService.getUserById(id);
}
@GetMapping("/search")
public List<User> searchUsers(@RequestParam String name) {
return userService.searchUsersByName(name);
}
}
@PathVariable và @RequestParam giống như những người săn lùng kho báu. Họ biết chính xác vị trí trong URL hoặc query để lấy ra những thông tin ta cần.
7. @Entity và @Table
@Entity: Được dùng để đánh dấu một class là thực thể trong JPA (Java Persistence API). Nó sẽ ánh xạ với một bảng trong cơ sở dữ liệu.
@Table: Dùng để chỉ định tên của bảng trong cơ sở dữ liệu nếu nó khác với tên class.
1
2
3
4
5
6
7
8
9
10
11
12
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// getter và setter
}
@Entity giống như tấm hộ chiếu của class. Nó nói với JPA rằng: “Tôi là một thực thể hợp pháp!” Trong khi đó, @Table giống như một người thông dịch, giúp ánh xạ tên class với tên bảng được lưu trong database.
8. @Transactional
Annotation này được dùng để đảm bảo rằng tất cả các thao tác trong một phương thức đều được thực hiện trong một transaction duy nhất. Nếu có lỗi xảy ra, tất cả các thay đổi sẽ được rollback.
1
2
3
4
5
6
7
8
@Service
public class PaymentService {
@Transactional
public void processPayment(Payment payment) {
// xử lý payment và update database
}
}
@Transactional giống như một hợp đồng giao dịch. Nếu mọi thứ suôn sẻ, giao dịch sẽ hoàn thành. Nhưng nếu có vấn đề, tất cả sẽ bị hủy bỏ.
Tạm kết
Annotation trong Spring Boot giống như các “biển báo giao thông” giúp điều hướng ứng dụng của chúng ta. Chúng giúp tránh rắc rối và khiến mọi thứ trở nên dễ dàng, mượt mà hơn. Hiểu rõ cách sử dụng chúng sẽ giúp bạn tiết kiệm rất nhiều thời gian khi phát triển ứng dụng.
Thôiii…, đau lưng, mỏi cổ quá rồi. Tạm gập máy lại rồi đi lượn vài vòng Sài Gòn cho khuây khoả rồi về … rãnh sẽ viết tiếp.
Bài viết mang tính chất “ghi chú, lưu trữ, chia sẻ và phi lợi nhuận”.
Nếu bạn thấy hữu ích, đừng quên chia sẻ với bạn bè và đồng nghiệp của mình nhé!
Happy coding! 😎 👍🏻 🚀 🔥