개발자가 클래스를 만들고 인스턴스를 관리하면 코드가 길어졌을 때 관리하기 힘들고 실수가 나올 수 있다. 이러한 문제를 예방하기 위해 프레임워크가 객체 생성과 프로그램 흐름을 제어하는 것을 제어의 역전이라 한다.
@Configuration
public class GreetingConfig {
@Bean
Greeting englishGreeting() {
return new EnglishGreeting();
}
}
@Configuration
public class OrderConfig {
@Bean
public OrderReceiverBean orderReceiverBean() { return new OrderReceiverBean(); }
@Bean
public PaymentProcessorBean paymentProcessorBean() { return new PaymentProcessorBean(); }
@Bean
OrderProcessorBean orderProcessorBean() { return new OrderProcessorBean(orderReceiverBean(), paymentProcessorBean()); }
}
@Component
public class EnglishFarewell implements Farewell {
@Override
public void sayGoodBye() {
System.out.println("good bye");
}
}
@RequiredArgsConstructor
@Component
public class AppStartupRunner implements ApplicationRunner {
private ChefBean chefBean;
private final OrderProcessorBean orderProcessorBean;
@Autowired
DeliveryServiceBean deliveryServiceBean;
@Autowired
public void setChefBean(ChefBean chefBean) {
this.chefBean = chefBean;
}
public void run(ApplicationArguments args) {
orderProcessorBean.processOrder();
chefBean.cook();
deliveryServiceBean.deliver();
}
}
객체가 필요로 하는 의존성을 외부에서 직접 주입받는 것을 의존성 주입이라 한다.

public class OrderReceiverBean {
public void receiveOrder(){
System.out.println("주문 받는다.");
}
}
public void processPayment(){
System.out.println("결제 처리를 한다.");
}
}
@RequiredArgsConstructor
public class OrderProcessorBean {
private final OrderReceiverBean orderReceiverBean;
private final PaymentProcessorBean paymentProcessorBean;
public void processOrder(){
orderReceiverBean.receiveOrder();
paymentProcessorBean.processPayment();
}
}
@Component
public class AppStartupRunner implements ApplicationRunner {
private ChefBean chefBean;
@Autowired
public void setChefBean(ChefBean chefBean) {
this.chefBean = chefBean;
}
@Component
public class AppStartupRunner implements ApplicationRunner {
private Greeting greeting;
@Autowired
public void setGreeting(Greeting greeting) {
this.greeting = greeting;
}
@Override
public void run(ApplicationArguments args) {
greeting.sayHello();
}
}
@Component
public class AppStartupRunner implements ApplicationRunner {
@Autowired
DeliveryServiceBean deliveryServiceBean;
}
@Component
public class AppStartupRunner implements ApplicationRunner {
@Autowired
private Greeting greeting;
@Override
public void run(ApplicationArguments args) {
greeting.sayHello();
}
}