PHẦN 1: CORE SPRING FRAMEWORK & SPRING BOOT (20 CÂU)
1. Dependency Injection (DI) và Inversion of Control (IoC) là gì?
Giải thích: IoC là nguyên lý thiết kế nơi luồng điều khiển của chương trình được chuyển cho container. DI là một dạng cụ thể của IoC, nơi các phụ thuộc của một object được "tiêm" vào từ bên ngoài thay vì object tự khởi tạo.
Code Demo:
@Service
public class UserService {
private final UserRepository repo;
@Autowired // Constructor Injection (Khuyên dùng)
public UserService(UserRepository repo) {
this.repo = repo;
}
}
2. Phân biệt @Component, @Service, @Repository, @Controller?
Giải thích: Cả 4 đều dùng để đánh dấu một Class là Bean. Tuy nhiên,
@Service,@Repository,@Controllerlà các chuyên biệt hóa của@Componentđể làm rõ mục đích (Layer Service, Layer Data, Layer Web).Code Demo:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {}
3. Bean Scope trong Spring là gì?
Giải thích: Có 5 loại: Singleton (mặc định), Prototype, Request, Session, Application.
Code Demo:
@Bean
@Scope("prototype")
public MyBean myBean() { return new MyBean(); }
4. Spring Boot Starters là gì?
Giải thích: Là các dependency tổng hợp (aggregators) giúp đơn giản hóa việc cấu hình. Thay vì thêm từng thư viện nhỏ, bạn chỉ cần thêm 1 starter (ví dụ:
spring-boot-starter-web).
5. @SpringBootApplication bao gồm những annotation nào?
Giải thích: Bao gồm:
@SpringBootConfiguration,@EnableAutoConfiguration, và@ComponentScan.
6. Cách xử lý ngoại lệ toàn cục trong Spring Boot?
Giải thích: Sử dụng
@ControllerAdvicekết hợp với@ExceptionHandler.Code Demo:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<?> handleNotFound(ResourceNotFoundException ex) {
return ResponseEntity.status(404).body(ex.getMessage());
}
}
7. @Autowired vs @Resource vs @Inject?
Giải thích:
@Autowiredlà của Spring (ưu tiên kiểu dữ liệu),@Resourcelà của JSR-250 (ưu tiên tên bean),@Injectlà của JSR-330.
8. Spring Profiles là gì?
Giải thích: Giúp tách biệt cấu hình cho các môi trường khác nhau (dev, test, prod).
Code Demo:
application-dev.properties,application-prod.yml. Sử dụng@Profile("dev").
9. Cách cấu hình Logging trong Spring Boot?
Giải thích: Spring Boot sử dụng Logback mặc định. Ta cấu hình qua
application.propertieshoặc filelogback-spring.xml.Code Demo:
logging.level.org.springframework=DEBUG
10. Spring Bean Lifecycle gồm những bước nào?
Giải thích: Instantiate -> Populate Properties -> BeanNameAware -> BeanFactoryAware -> Pre-init (BeanPostProcessor) -> AfterPropertiesSet -> Custom Init -> Post-init -> Ready -> Destroy.
11. @Value dùng để làm gì?
Giải thích: Đọc giá trị từ file cấu hình hoặc biến môi trường.
Code Demo:
@Value("${app.timeout}") private int timeout;
12. CommandLineRunner và ApplicationRunner là gì?
Giải thích: Là các interface dùng để thực thi code ngay sau khi Spring Boot app khởi chạy thành công.
13. Spring Boot Actuator dùng làm gì?
Giải thích: Cung cấp các endpoint để giám sát và quản lý ứng dụng (health, metrics, info).
Code Demo: Truy cập
/actuator/health.
14. Phân biệt @RestController và @Controller?
Giải thích:
@RestController = @Controller + @ResponseBody.@RestControllertrả về dữ liệu (JSON/XML),@Controllerthường trả về View (HTML).
15. @RequestBody và @RequestParam khác gì nhau?
Giải thích:
@RequestBodyđọc dữ liệu từ Body của request (JSON),@RequestParamđọc từ Query string trên URL.
16. @PathVariable dùng khi nào?
Giải thích: Dùng để lấy giá trị động từ URL path.
Code Demo:
@GetMapping("/users/{id}") public User getUser(@PathVariable Long id) { ... }
17. Spring Boot Auto-configuration hoạt động như thế nào?
Giải thích: Dựa trên các file JAR trong classpath, Spring Boot sẽ tự động cấu hình các Bean cần thiết (ví dụ thấy H2 JAR sẽ tự cấu hình DataSource).
18. @Transactional hoạt động như thế nào?
Giải thích: Sử dụng Proxy để quản lý transaction. Nếu phương thức ném ra
RuntimeException, transaction sẽ rollback.
19. Cách thay đổi cổng (port) mặc định của Spring Boot?
Giải thích: Trong
application.properties:server.port=8081.
20. @Lazy annotation dùng làm gì?
Giải thích: Trì hoãn việc khởi tạo Bean cho đến khi nó thực sự được sử dụng lần đầu tiên.
PHẦN 2: SPRING DATA JPA & DATABASE (10 CÂU)
21. Hibernate vs Spring Data JPA?
Giải thích: Hibernate là một implementation của JPA (ORM framework). Spring Data JPA là một layer trừu tượng nằm trên JPA để giảm thiểu code boilerplate.
22. Lazy Loading vs Eager Loading?
Giải thích: Lazy loading chỉ tải dữ liệu liên quan khi cần thiết. Eager loading tải tất cả ngay lập tức.
Code Demo:
@OneToMany(fetch = FetchType.LAZY)
23. N+1 Problem là gì và cách khắc phục?
Giải thích: Xảy ra khi query 1 bản ghi cha nhưng lại phát sinh thêm N query để lấy dữ liệu con. Khắc phục bằng
JOIN FETCHhoặc@EntityGraph.Code Demo:
@Query("SELECT u FROM User u JOIN FETCH u.posts")
24. @Entity và @Table khác gì nhau?
Giải thích:
@Entityđánh dấu class là một thực thể JPA.@Tabledùng để chỉ định tên bảng thực tế trong DB.
25. Phân biệt save(), saveAndFlush(), saveAll()?
Giải thích:
save()lưu vào cache (flush sau),saveAndFlush()đẩy dữ liệu xuống DB ngay lập tức.
26. Cách thực hiện Pagination và Sorting?
Code Demo:
Pageable pageable = PageRequest.of(0, 10, Sort.by("name"));
Page<User> users = repository.findAll(pageable);
27. @Id và @GeneratedValue?
Giải thích:
@Idđánh dấu khóa chính.@GeneratedValuexác định chiến lược sinh ID (Auto, Identity, Sequence, Table).
28. @Transient dùng làm gì?
Giải thích: Đánh dấu một trường không được lưu (persist) vào database.
29. Lợi ích của việc dùng DTO (Data Transfer Object)?
Giải thích: Bảo mật (ẩn các trường nhạy cảm), giảm tải dữ liệu truyền đi, tách biệt Model DB và Model API.
30. Cách cấu hình kết nối nhiều Database trong Spring Boot?
Giải thích: Tạo nhiều
DataSourcebean và chỉ định@Primarycho một cái, cấu hìnhEntityManagerFactoryriêng cho từng cái.
PHẦN 3: MICROSERVICES & SPRING CLOUD (10 CÂU)
31. Microservices là gì?
Giải thích: Là kiến trúc phần mềm chia ứng dụng thành các dịch vụ nhỏ, độc lập, giao tiếp qua network (HTTP/gRPC/Message Broker).
32. API Gateway là gì? (Spring Cloud Gateway)
Giải thích: Là điểm vào duy nhất của hệ thống, chịu trách nhiệm routing, authentication, rate limiting.
33. Service Discovery là gì? (Netflix Eureka)
Giải thích: Giúp các microservice tìm thấy nhau mà không cần cấu hình cứng IP/Port.
34. Circuit Breaker là gì? (Resilience4j)
Giải thích: Ngăn chặn lỗi lan truyền. Nếu một service bị sập, Circuit Breaker sẽ ngắt kết nối và trả về fallback response.
Code Demo:
@CircuitBreaker(name = "userService", fallbackMethod = "fallback")
35. Config Server là gì?
Giải thích: Quản lý cấu hình tập trung cho tất cả microservices (thường lưu trên Git).
36. Cách giao tiếp giữa các Microservices?
Giải thích: Đồng bộ (RestTemplate, OpenFeign) hoặc Bất đồng bộ (RabbitMQ, Kafka).
37. Load Balancing trong Microservices? (Spring Cloud LoadBalancer)
Giải thích: Phân phối request đến các instance khác nhau của cùng một service để tối ưu hiệu năng.
38. Distributed Tracing là gì? (Zipkin/Sleuth)
Giải thích: Theo dõi vết của một request khi nó đi qua nhiều microservices khác nhau.
39. Saga Pattern là gì?
Giải thích: Cách quản lý transaction phân tán trong microservices thông qua chuỗi các local transaction và bù đắp (compensating).
40. Stateless vs Stateful Service?
Giải thích: Microservices nên là Stateless (không lưu trạng thái client trên server) để dễ dàng scale ngang.
PHẦN 4: DOCKER (10 CÂU)
41. Docker là gì?
Giải thích: Là nền tảng container hóa giúp đóng gói ứng dụng và tất cả phụ thuộc vào một Container duy nhất, chạy nhất quán mọi nơi.
42. Phân biệt Image và Container?
Giải thích: Image là bản thiết kế (đóng băng), Container là một instance đang chạy của Image đó.
43. Dockerfile là gì?
Giải thích: Là file text chứa tập hợp các lệnh để build một Docker Image.
Code Demo:
FROM openjdk:17
COPY target/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
44. Docker Compose dùng làm gì?
Giải thích: Dùng để định nghĩa và chạy ứng dụng có nhiều container (ví dụ: App + Database) bằng một file YAML duy nhất.
45. Docker Volume là gì?
Giải thích: Dùng để lưu trữ dữ liệu bền vững (persistent data) bên ngoài vòng đời của container.
46. Cách tối ưu hóa Docker Image cho Java?
Giải thích: Sử dụng Multi-stage build, chọn base image nhẹ (Alpine), sử dụng JRE thay vì JDK cho runtime.
47. Lệnh docker ps và docker images khác gì nhau?
Giải thích:
psliệt kê các container đang chạy,imagesliệt kê các image hiện có trên máy.
48. Container Orchestration là gì?
Giải thích: Việc quản lý hàng nghìn container (tự động scale, tự sửa lỗi). Ví dụ: Kubernetes (K8s) hoặc Docker Swarm.
49. Networking trong Docker?
Giải thích: Docker cung cấp các driver: bridge (mặc định), host, none, overlay (cho đa máy chủ).
50. Cách truyền biến môi trường vào Docker Container?
Giải thích: Dùng flag
-ehoặc file.env.Lệnh:
docker run -e DB_URL=jdbc:mysql://db:3306/mydb my-app