Written on 13th April 2026 by Carter Phan.
DI = Không tự tạo object → được inject từ bên ngoài
class UserService {
private UserRepository userRepository = new UserRepository();
}
class UserService {
private UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
Spring sẽ control việc tạo và quản lý object
⇒ Nói đơn giản:
IoC = “framework control everything” DI = “cách framework đưa dependency vào”
| Concept | Meaning |
| IoC | Ý tưởng đảo ngược control |
| DI | Cách implement IoC |
Bean = object được Spring quản lý trong IoC Container
@Service
class UserService {}
@Repository
class UserRepository {}
⇒ Spring sẽ tự tạo và quản lý các object này
@Autowired
private UserRepository userRepository;
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
final)
Nếu có nhiều implementation:
interface PaymentService {}
class PaypalService implements PaymentService {}
class StripeService implements PaymentService {}
👉 Spring sẽ throw:
NoUniqueBeanDefinitionException
@Qualifier("paypalService")
@Primary
1. Instantiate
2. Populate properties (DI)
3. Aware callbacks
4. Pre-initialization
5. Initialize (@PostConstruct)
6. Ready to use
7. Destroy (@PreDestroy)
newUserService()
👉 Chưa có dependency
constructor(UserRepository repo)
👉 Inject dependency vào
BeanNameAware
ApplicationContextAware
👉 Bean biết về container
👉 Spring apply:
@PostConstruct
👉 Chạy sau khi inject xong
👉 Bean được dùng trong app
@PreDestroy
👉 Khi app shutdown
@Service
classUserService {
publicUserService() {
System.out.println("1. Constructor");
}
@PostConstruct
publicvoidinit() {
System.out.println("2. Init");
}
@PreDestroy
publicvoiddestroy() {
System.out.println("3. Destroy");
}
}
Bean lifecycle bao gồm các bước: tạo object, inject dependency, khởi tạo (@PostConstruct), sử dụng và hủy (@PreDestroy). Ngoài ra còn có các bước trung gian như BeanPostProcessor để customize bean.
int count = 0;
⇒ Có thể gây race condition
@Configuration
@EnableAutoConfiguration
@ComponentScan
Tự động cấu hình dựa trên dependency
@Conditional
Start App
↓
Create ApplicationContext (IoC container)
↓
Scan Component (@ComponentScan)
↓
Create Bean (Instantiate)
↓
Inject Dependency (DI)
↓
@PostConstruct
↓
App Ready
@Bean
public DataSource dataSource() {}
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})