Câu hỏi & gợi ý trả lời
Q1. Sự khác biệt chính giữa Spring Framework và Spring Boot là gì?
Spring Framework tập trung vào Dependency Injection (DI) và Inversion of Control (IoC), đòi hỏi cấu hình XML hoặc Java Config rất kỹ. Spring Boot đóng gói sẵn các cấu hình đó (opinionated defaults), hỗ trợ nhúng Server (Tomcat) và triển khai nhanh chóng mà không cần cấu hình phức tạp.
Q2. Annotation @SpringBootApplication làm những gì?
Đây là một sự kết hợp của 3 annotation: @Configuration (đánh dấu class là nguồn định nghĩa bean), @EnableAutoConfiguration (kích hoạt tính năng cấu hình tự động của Spring Boot), và @ComponentScan (quét các component trong package hiện tại và con của nó).
Q3. Spring Boot Starter là gì và tại sao chúng quan trọng?
Starter là tập hợp các dependency mô tả chính xác những thư viện cần cho một tính năng cụ thể (ví dụ: spring-boot-starter-web cho ứng dụng web, spring-boot-starter-data-jpa cho database). Chúng giúp đơn giản hóa quản lý dependency và đảm bảo tính tương thích của các version thư viện.
Q4. Cơ chế Auto-configuration trong Spring Boot hoạt động như thế nào?
Spring Boot tự động cấu hình các bean dựa trên các thư viện jar tìm thấy trong classpath. Nó sử dụng @ConditionalOnClass, @ConditionalOnMissingBean để quyết định xem liệu một cấu hình nào đó có nên được nạp hay không giúp ứng dụng sẵn sàng ngay mà không cần cấu hình thủ công.
Q5. Làm thế nào để xử lý Exception trên toàn cục trong Spring Boot?
Sử dụng annotation @ControllerAdvice (hoặc @RestControllerAdvice) kết hợp với @ExceptionHandler. Cách này tách biệt logic xử lý lỗi ra khỏi các Controller, giúp code sạch hơn và quản lý response lỗi đồng nhất cho toàn hệ thống.
Q6. Dependency Injection (DI) là gì và Spring thực hiện nó ra sao?
DI là kỹ thuật cung cấp đối tượng (dependency) cho class thay vì để class tự tạo ra nó, giúp thực hiện loosely coupled (lỏng lẻo liên kết). Spring container quản lý lifecycle của các bean và inject chúng thông qua Constructor, Setter hoặc Field injection.
Q7. Phân biệt các Bean Scope phổ biến trong Spring?
Scope phổ biến nhất là Singleton (mặc định - một instance duy nhất trong container). Các loại khác bao gồm Prototype (tạo mới mỗi khi request), Request (trong một HTTP request), và Session (trong một HTTP session).
Q8. Spring Actuator dùng để làm gì?
Actuator cung cấp các endpoint (như /health, /metrics, /env) để giám sát và quản lý ứng dụng đang chạy. Nó cực kỳ hữu ích trong môi trường Production để kiểm tra trạng thái sức khỏe, log, hoặc cấu hình runtime mà không cần can thiệp code.
Q9. Spring Profile dùng trong trường hợp nào?
Profile cho phép định nghĩa các tập hợp cấu hình riêng biệt cho từng môi trường (như 'dev', 'test', 'prod'). Bạn có thể kích hoạt bằng cách set property 'spring.profiles.active' để chọn file cấu hình phù hợp mà không cần thay đổi source code.
Q10. Spring Data JPA hỗ trợ gì cho việc truy vấn database?
Spring Data JPA cung cấp tầng trừu tượng hóa trên JPA, cho phép thực hiện các thao tác CRUD cơ bản chỉ bằng cách khai báo interface kế thừa từ JpaRepository. Nó hỗ trợ tự động tạo truy vấn dựa trên tên phương thức (Method Query) và giảm bớt việc viết code SQL dài dòng.
Q11. Sự khác biệt giữa Application.properties và Application.yml?
Cả hai đều để cấu hình property. Properties file có cấu trúc key-value phẳng, dễ đọc nhưng lặp lại key. YAML có cấu trúc phân cấp (hierarchical), nhìn trực quan hơn và hỗ trợ tốt cho các danh sách hoặc cấu hình phức tạp.
Q12. Spring Security kiểm soát bảo mật bằng cách nào?
Nó dựa trên một chuỗi các filter (Filter Chain) để kiểm soát quyền truy cập. Nó xử lý Authentication (xác thực ai là ai) và Authorization (xác định họ được làm gì) thông qua các cơ chế như JWT, OAuth2, hoặc Basic Auth, dựa trên các cấu hình HttpSecurity.