Phỏng vấn vị trí lập trình Java Spring Boot


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:

Java
@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, @Controller là 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:

Java
@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:

Java
@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 @ControllerAdvice kết hợp với @ExceptionHandler.

  • Code Demo:

Java
@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: @Autowired là của Spring (ưu tiên kiểu dữ liệu), @Resource là của JSR-250 (ưu tiên tên bean), @Inject là 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.properties hoặc file logback-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. @RestController trả về dữ liệu (JSON/XML), @Controller thườ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.


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 FETCH hoặ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. @Table dù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:

Java
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. @GeneratedValue xá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 DataSource bean và chỉ định @Primary cho một cái, cấu hình EntityManagerFactory riêng cho từng cái.


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.


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:

Dockerfile
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 psdocker images khác gì nhau?

  • Giải thích: ps liệt kê các container đang chạy, images liệ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 -e hoặc file .env.

  • Lệnh: docker run -e DB_URL=jdbc:mysql://db:3306/mydb my-app

Phản hồi từ học viên

5

Tổng 0 đánh giá
Developer Toolbox

TEXT CASE

FORMAT & CLEAN

ENCODE & DECODE

JSON & CRYPTO

Đã sao chép!!!
Gozic - Hệ thống học lập trình, luyện thi, kiểm tra trắc nghiệm trực tuyến uy tín tại Việt Nam.
Hotline: 0967025996
Gozic - Hệ thống học lập trình, luyện thi, kiểm tra trắc nghiệm trực tuyến uy tín tại Việt Nam.