Bean lifecycle, post-processors và scope
Hiểu creation pipeline giúp giải thích lúc dependency được inject, lúc proxy xuất hiện, callback nào được gọi và vì sao một bean có thể hoạt động khác object được tạo bằng new.
Creation pipeline
- Instantiate qua constructor hoặc factory method.
- Populate dependencies và properties.
- Gọi các
Awarecallbacks để cung cấp metadata của container. - Chạy
BeanPostProcessortrước initialization. - Chạy
@PostConstruct,InitializingBeanhoặc custom init method. - Chạy
BeanPostProcessorsau initialization; bước này thường trả về proxy. - Bean sẵn sàng được lookup và sử dụng.
- Khi context đóng, chạy pre-destroy, disposable hoặc custom destroy cho managed singleton.
Không dựa vào thứ tự giữa nhiều post-processors nếu chưa khai báo Ordered hoặc PriorityOrdered. BeanFactoryPostProcessor sửa bean definitions trước object creation; BeanPostProcessor xử lý instances.
Scope và ownership
| Scope | Lifecycle | Caveat |
|---|---|---|
| Singleton | Một instance mỗi container, thường eager. | Được gọi đồng thời; mutable request state gây race. |
| Prototype | Tạo instance mỗi lần lookup/injection request. | Container không quản lý destruction hoàn chỉnh. |
| Request/session/application/websocket | Gắn với web context tương ứng. | Không được giữ target ra ngoài scope. |
| Custom scope | Gắn lifecycle vào tenant, job hoặc context riêng. | Phải định nghĩa resolve, destruction và cleanup rõ ràng. |
Scoped proxy
Singleton cần tham chiếu request-scoped bean thông qua proxy để resolve target theo request hiện tại. Một lựa chọn khác là ObjectProvider. Proxy làm class và identity khác target, nên code không được phụ thuộc concrete identity hoặc giữ scoped object sau khi scope kết thúc.
Lazy initialization và startup
Lazy initialization giảm startup time nhưng chuyển lỗi cấu hình sang request đầu tiên, làm capacity warm-up và observability khó hơn. Chỉ dùng cho dependency tùy chọn hoặc đắt có chủ đích; không bật toàn cục để che startup chậm hay dependency graph lỗi.
SmartLifecycle và graceful shutdown
Infrastructure component có phase, auto-start và stop callback. Phase thấp start trước và stop sau. Graceful shutdown cần dừng nhận work mới, drain work đang chạy, rồi release connection, executor hoặc broker resource trong timeout.
Thread safety của singleton
Singleton service thường được nhiều request threads gọi đồng thời. Field chứa collaborator immutable là bình thường; field chứa request state hoặc counter mutable cần synchronization, atomic primitive hoặc chuyển state sang local/domain storage. Prototype không tự giải quyết thread safety nếu instance vẫn bị chia sẻ.
@PostConstruct có thể chạy trước khi proxy/interceptor mong muốn có hiệu lực. Hãy giữ initialization nhỏ, idempotent và tránh external I/O khó rollback.