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 cung cấp khung nền tảng để phát triển ứng dụng Java với Dependency Injection và AOP nhưng yêu cầu cấu hình (XML, beans) phức tạp. Spring Boot là một lớp bao bọc (wrapper) giúp đơn giản hóa việc này thông qua Auto-configuration, cung cấp các Embedded Server (Tomcat) có sẵn và Starter Dependencies, giúp giảm thiểu cấu hình thủ công.
Q2. Cơ chế hoạt động của @SpringBootApplication là gì?
Đây là annotation dùng để đánh dấu lớp chủ (main class). Nó thực chất là sự kết hợp của 3 annotation chính: @Configuration (đánh dấu lớp là nguồn bean definition), @EnableAutoConfiguration (kích hoạt khả năng cấu hình tự động của Spring Boot), và @ComponentScan (tự động quét các thành phần như Controller, Service, Repository trong project).
Q3. Làm thế nào để tùy chỉnh Auto-configuration của Spring Boot?
Bạn có thể sử dụng annotation @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) để loại trừ các cấu hình tự động không mong muốn. Ngoài ra, bạn có thể định nghĩa lại Bean của chính mình bằng việc sử dụng @Bean hoặc @Primary, lúc này Spring Boot sẽ ưu tiên sử dụng cấu hình do bạn cung cấp hơn là mặc định.
Q4. Sự khác biệt giữa Starter Dependencies và thư viện thông thường?
Starter Dependencies (như spring-boot-starter-web) là các tập hợp các thư viện được đóng gói sẵn với các phiên bản tương thích (version alignment) đã được kiểm thử. Sử dụng Starters giúp bạn tránh được tình trạng 'Dependency Hell' (xung đột phiên bản thư viện) và giúp quá trình thiết lập project nhanh chóng hơn.
Q5. Profiles trong Spring Boot được sử dụng khi nào?
Profiles (như dev, staging, prod) được dùng để tách biệt cấu hình môi trường. Bạn có thể định nghĩa các file application-{profile}.properties hoặc dùng annotation @Profile trên Bean để quyết định Bean đó chỉ được nạp vào context khi môi trường cụ thể đang được kích hoạt.
Q6. Bạn hiểu thế nào về Spring Boot Actuator?
Actuator là một module quan trọng giúp giám sát và quản lý ứng dụng khi deploy lên môi trường production. Nó cung cấp các endpoint (như /actuator/health, /actuator/metrics, /actuator/info) cho phép bạn theo dõi tình trạng sức khỏe của ứng dụng, dung lượng bộ nhớ, trạng thái database mà không cần viết thêm code.
Q7. Spring Boot xử lý ngoại lệ (Exception Handling) toàn cục như thế nào?
Chúng ta sử dụng @ControllerAdvice hoặc @RestControllerAdvice kết hợp với @ExceptionHandler để bắt các exception xảy ra trong ứng dụng. Cách này giúp tách biệt logic xử lý lỗi ra khỏi các Controller, đảm bảo mã nguồn sạch sẽ và trả về response chuẩn xác (gồm HTTP status code và error message) cho phía client.
Q8. Sự khác biệt giữa @RestController và @Controller?
@Controller được dùng để trả về một View (thường là HTML template). Trong khi đó, @RestController là sự kết hợp của @Controller và @ResponseBody, có nghĩa là dữ liệu trả về sẽ tự động được serialization sang JSON/XML và gửi trực tiếp vào body của HTTP response, phù hợp cho phát triển RESTful API.
Q9. Làm thế nào để cấu hình kết nối database trong Spring Boot?
Bạn cần cung cấp các property tương ứng trong application.properties hoặc application.yml như spring.datasource.url, spring.datasource.username, và spring.datasource.password. Spring Boot sẽ tự động cấu hình DataSource dựa trên các thông số này nếu bạn đã add dependency như spring-boot-starter-data-jpa hoặc spring-boot-starter-jdbc vào project.
Q10. Dependency Injection (DI) trong Spring Boot hoạt động ra sao?
DI là kỹ thuật mà các đối tượng không tự khởi tạo các dependency của chúng mà chúng được 'tiêm' vào bởi Spring Container (thường qua Constructor Injection, Setter Injection hoặc Field Injection). Constructor Injection được khuyến nghị dùng vì tính immutable và dễ unit test.
Q11. Embedded Servers trong Spring Boot là gì và tại sao lại dùng?
Spring Boot tích hợp sẵn các web server như Tomcat, Jetty hoặc Undertow bên trong file JAR của ứng dụng. Việc này loại bỏ nhu cầu cài đặt và quản trị server thủ công bên ngoài, cho phép ứng dụng chạy như một tiến trình Java thông thường và hỗ trợ tốt cho kiến trúc Microservices và Cloud-native.
Q12. Làm sao để thực hiện chạy tác vụ định kỳ (Scheduler) trong Spring Boot?
Bạn chỉ cần sử dụng annotation @EnableScheduling trên class cấu hình và đánh dấu @Scheduled lên phương thức cần chạy định kỳ. Bạn có thể cấu hình thời gian chạy bằng thuộc tính fixedRate, fixedDelay hoặc sử dụng cron expression để linh hoạt điều chỉnh lịch trình.
Q13. Cơ chế của @Transactional trong Spring Boot/Spring Data JPA?
@Transactional đảm bảo tính toàn vẹn dữ liệu bằng cách quản lý lifecycle của một transaction (begin, commit, rollback). Nếu một phương thức được đánh dấu @Transactional gặp exception (unchecked), Spring sẽ tự động rollback lại mọi thay đổi trong database thực hiện trong phạm vi phương thức đó.
Q14. Spring Boot có hỗ trợ bảo mật không?
Có, thông qua Spring Security. Bạn chỉ cần add spring-boot-starter-security để kích hoạt các tính năng bảo mật bao gồm xác thực (Authentication - ai là người dùng) và phân quyền (Authorization - họ được phép làm gì). Nó mặc định bảo vệ tất cả endpoint và có thể tùy chỉnh dễ dàng qua SecurityFilterChain.
Q15. Sự khác biệt giữa Bean Scope (Singleton vs Prototype) là gì?
Singleton (mặc định) nghĩa là Spring Container chỉ tạo duy nhất một instance của Bean và chia sẻ nó cho mọi request. Ngược lại, Prototype có nghĩa là mỗi khi có yêu cầu (request) lấy Bean, Spring sẽ tạo ra một instance hoàn toàn mới, thường dùng cho các Bean có trạng thái cần được tách biệt.