BeanFactory và ApplicationContext đều là Spring IoC container, nhưng ApplicationContext là superset.
| Feature | BeanFactory | ApplicationContext |
|---|---|---|
| Lazy loading | ✅ Default | ❌ Eager (singleton instantiate ngay) |
| AOP, @Transactional | ❌ | ✅ |
| Event publishing | ❌ | ✅ (ApplicationEvent) |
| MessageSource (i18n) | ❌ | ✅ |
| Web context | ❌ | ✅ (WebApplicationContext) |
| Auto-config, Starters | ❌ | ✅ |
java
// BeanFactory — API thấp, không dùng trực tiếp trong thực tế
// (XmlBeanFactory đã bị xóa từ Spring 5; DefaultListableBeanFactory là impl hiện tại)
// ApplicationContext — dùng trong Spring Boot
@SpringBootApplication
public class App {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(App.class, args);
// ctx.getBean(UserService.class);
}
}Khi nào biết điều này quan trọng trong phỏng vấn:
- Giải thích lazy vs eager loading.
- ApplicationContext.publishEvent() cho application events:
java
@Component
class OrderService {
@Autowired ApplicationEventPublisher events;
void placeOrder(Order order) {
orderRepo.save(order);
events.publishEvent(new OrderPlacedEvent(order.getId()));
}
}
@Component
class EmailNotifier {
@EventListener
void onOrder(OrderPlacedEvent event) {
mailService.sendConfirmation(event.getOrderId());
}
}Kết luận: Spring Boot luôn dùng ApplicationContext. BeanFactory là low-level API, không dùng trực tiếp trong thực tế.
BeanFactory and ApplicationContext are both Spring IoC containers, but ApplicationContext is a superset.
| Feature | BeanFactory | ApplicationContext |
|---|---|---|
| Lazy loading | ✅ Default | ❌ Eager (singletons instantiated at startup) |
| AOP, @Transactional | ❌ | ✅ |
| Event publishing | ❌ | ✅ (ApplicationEvent) |
| MessageSource (i18n) | ❌ | ✅ |
| Web context | ❌ | ✅ (WebApplicationContext) |
| Auto-config, Starters | ❌ | ✅ |
java
// BeanFactory — low-level API, not used directly in practice
// (XmlBeanFactory was removed in Spring 5; DefaultListableBeanFactory is the current impl)
// ApplicationContext — used in Spring Boot
@SpringBootApplication
public class App {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(App.class, args);
}
}Why this matters in interviews: explain lazy vs eager, event-driven patterns:
java
@Component
class OrderService {
@Autowired ApplicationEventPublisher events;
void placeOrder(Order order) {
orderRepo.save(order);
events.publishEvent(new OrderPlacedEvent(order.getId()));
}
}
@Component
class EmailNotifier {
@EventListener
void onOrder(OrderPlacedEvent event) {
mailService.sendConfirmation(event.getOrderId());
}
}Conclusion: Spring Boot always uses ApplicationContext. BeanFactory is a low-level API not used directly in practice.