BeanFactory và ApplicationContext đều là Spring IoC container — ApplicationContext là superset.
| Feature | BeanFactory | ApplicationContext |
|---|---|---|
| Lazy loading | ✅ Default | ❌ Eager (singleton tạo lúc startup) |
| AOP, @Transactional | ❌ | ✅ |
| Event publishing | ❌ | ✅ (ApplicationEvent) |
| MessageSource (i18n) | ❌ | ✅ |
| Web context | ❌ | ✅ (WebApplicationContext) |
| Auto-config, Starters | ❌ | ✅ |
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 chạm 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ế.