의존관계주입(Dependecy Injection)이라고도 하며, 어떤 객체가 사용하는 의존 객체를 직접 만들어 사용하는 것이 아니라 주입 받아 사용하는 방법을 말한다
private BookRepository bookRepository = new BookRepository();
private BookRepository bookRepository;
public BookService(BookRepository bookRepository){
this.bookRepository = bookRepository;
}
빈 팩토리(BeanFactory) : IoC컨테이너의 가장 최상위에 있는 인터페이스로서 빈(bean)들을 관리한다는 의미의 컨테이너이다.
public OwnerController(OwnerRepository Serviec, ApplicationContext applicationContext){
this.owners = Service;
this.applicationContext = applicationContext;
}
@GetMapping("/bean")
@ReponseBody
public String bean(){
return "bean : " + applicationContext.getBean(OwnerController.class);
}
@GetMapping("/bean")
@ReponseBody
public String bean(){
return "bean : " + owners;
}
위의 예제에서 같은 owners객체의 해시값이 출력되는데 그 이유는 객체 하나를 어플리케이션 전반에서 계속 재사용하기 때문이다. 이러한 인스턴스들은 싱글톤 스코프(Singleton Scope)의 빈으로 등록되어 있다.
싱글톤으로 객체를 만들어 사용하고 싶을 때 IoC컨테이너를 사용하면 편리하다. IoC컨테이너에 아무 어노테이션을 붙이지 않고 빈으로 등록하면 기본적으로 싱글톤 스코프로 빈들이 등록된다.
싱글톤은 항상 같은 객체를 사용하므로 메모리 면에서 효율적이고, 런타임시 이미 컨테이너에 만들어놓은 객체를 사용하므로 성능 최적화에도 유리하다.