IoC를 구현하는 패턴이라고 볼 수 있음
IoC는 다양한 방법으로 만들 수 있음 → 전략 패턴, 서비스 로케이터 패턴, 팩토리 패턴, 의존관계 주입패턴
지금까지 우리가 Order가 어떠한 Voucher 객체를 생성할지 OrderService가 어떤 OrderRepository 객체 생성할지 스스로 결정하지 않고 생성자를 통해서 객체를 주입받는 패턴
→ 생성자 주입 패턴(Dependency Injection)
그 외에도 스프링은 세터 기반의 의존관계 주입도 지원하지만 생성자 주입 패턴을 추천
A → B를 참조하고 B → A를 참조할경우 순환 의존관계가 형성되면서 BeanCurrentlyInCreationException 예외가 발생할 수 있음
class A{
private final B b;
A(B b) {
this.b = b;
}
}
class B{
private final A a;
B(A a) {
this.a = a;
}
}
@Configuration
class CircularConfig{
@Bean
public A a(B b){
return new A(b);
}
@Bean
public B b(A a){
return new B(a);
}
}
public class CircularDepTester {
public static void main(String[] args) {
var annotationConfigApplicationContext=new AnnotationConfigApplicationContext(CircularConfig.class);
}
}