Part 03 · Spring Framework & Spring Boot · 3.1.02

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

  1. Instantiate qua constructor hoặc factory method.
  2. Populate dependencies và properties.
  3. Gọi các Aware callbacks để cung cấp metadata của container.
  4. Chạy BeanPostProcessor trước initialization.
  5. Chạy @PostConstruct, InitializingBean hoặc custom init method.
  6. Chạy BeanPostProcessor sau initialization; bước này thường trả về proxy.
  7. Bean sẵn sàng được lookup và sử dụng.
  8. 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

ScopeLifecycleCaveat
SingletonMột instance mỗi container, thường eager.Được gọi đồng thời; mutable request state gây race.
PrototypeTạo instance mỗi lần lookup/injection request.Container không quản lý destruction hoàn chỉnh.
Request/session/application/websocketGắn với web context tương ứng.Không được giữ target ra ngoài scope.
Custom scopeGắ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ẻ.

Failure mode: một bean tự khởi tạo collaborator trong constructor hoặc gọi logic phụ thuộc proxy ở @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.
Nguồn tham khảo