BeanFactory và ApplicationContext đều là Spring IoC container — ApplicationContext là superset.
| Feature | BeanFactory | ApplicationContext |
|---|---|---|
| Lazy loading | Có — Default | Không — Eager (singleton tạo lúc startup) |
| AOP, @Transactional | Không | Có |
| Event publishing | Không | Có — (ApplicationEvent) |
| MessageSource (i18n) | Không | Có |
| Web context | Không | Có — (WebApplicationContext) |
| Auto-config, Starters | Không | Có |
Eager của ApplicationContext là ưu điểm production: lỗi config/wiring lộ ngay lúc startup thay vì lúc request đầu tiên gọi tới bean.
Event publishing dùng qua ApplicationEventPublisher.publishEvent(...) + @EventListener — chi tiết xem câu @TransactionalEventListener.
Kết luận: Spring Boot luôn dùng ApplicationContext (SpringApplication.run(...) trả về chính nó). BeanFactory là API low-level bên dưới, không dùng trực tiếp trong thực tế.