Bean scope quyết định container tạo bao nhiêu instance và chúng sống bao lâu. Các lifecycle callback cho phép bạn chạy code ngay sau khi bean được tạo và ngay trước khi nó bị hủy.
Bean scope quyết định container tạo bao nhiêu instance và chúng sống bao lâu. Các lifecycle callback cho phép bạn chạy code ngay sau khi bean được tạo và ngay trước khi nó bị hủy.
@Service // mặc định singleton — một OrderService dùng chung cho cả app
public class OrderService { }
@Component
@Scope("prototype") // instance mới mỗi lần getBean/inject
public class ReportBuilder { }
Bẫy kinh điển: inject một prototype vào một singleton. Singleton chỉ được wire một lần, nên nó giữ mãi một instance prototype duy nhất — lời hứa "mới mỗi lần" bị phá vỡ. Sửa bằng @Lookup, một ObjectProvider<ReportBuilder>, hoặc scoped-proxy.
@Component
public class ConnectionPool {
@PostConstruct // chạy sau khi dependency được inject, trước khi dùng
public void open() { /* mở socket, làm nóng cache */ }
@PreDestroy // chạy khi container tắt êm (chỉ singleton)
public void close() { /* giải phóng tài nguyên */ }
}
Lưu ý: Spring không gọi @PreDestroy trên bean prototype — nó giao bean cho bạn rồi ngừng theo dõi, nên bạn tự chịu trách nhiệm dọn dẹp.
Điều này tách người coi Spring là phép màu khỏi người hiểu container. Lỗi singleton-giữ-một-prototype là kịch bản phỏng vấn ưa thích vì nó tinh vi và gây bug thật ở production. Biết rằng singleton phải stateless và thread-safe (chúng được chia sẻ giữa mọi thread request) là điều thực tiễn mà người phỏng vấn muốn nghe.
Thư viện câu hỏi phỏng vấn IT với đáp án chi tiết — từ Junior đến Senior.
Ủng hộ