
private final OwnerRepository owners;
public OwnerController(OwnerRepository clinicService) {
this.owners = clinicService;
}
여기서 OwnerRepository는 빈으로 등록되어있다.
따라서 스프링이 OwnerController를 만들 때, IoC 컨테이너가 빈으로 등록돼 있는 객체 중 OwnerRepository와 타입이 일치하는 객체를 찾아 자동으로 의존성을 주입해준다.
의존성 주입은 Bean들 끼리만 가능하다. (즉 위 예시에서는 의존성을 주입받는 OwnerController와 주입이 되는 OwenrRepository가 모두 빈으로 등록되어 있다.)
즉, 스프링 IoC 컨테이너 안에 들어있는 객체들끼리만 의존성 주입을 할 수 있다.
IoC 컨테이너 밖에 있는 객체에 주입을 해주는 방법이 있다고는 하지만, 잘 쓰지 않으며 추천하지 않는다.
기본적으로는 스프링 IoC 컨테이너 안에있는 빈 객체들끼지 의존성 주입을 해준다.
여기서 빈으로 등록된 OwnerRepository는 싱글톤 객체이다. 즉 전체 어플리케이션에서 그 클래스 타입을 가진 객체가 딱 하나 존재하는 것이다.
이렇게 스프링 IoC 컨테이너를 이용하여 싱글톤 인스턴스를 편리하게 관리할 수 있다.
// IoC 컨테이너
private final ApplicationContext applicationContext;
private final OwnerRepository owners;
public OwnerController(OwnerRepository clinicService, ApplicationContext applicationContext) {
this.owners = clinicService;
this.applicationContext = applicationContext;
}
@GetMapping("/bean")
@ResponseBody
public String bean() {
// OwnerController의 해시값을 볼 수 있다.
return "bean: " + applicationContext.getBean(OwnerController.class);
}
이런 식으로 applicationContext 인스턴스의 getBean() 메소드를 통해서 빈들의 해시값을 볼 수도 있다.
하지만 이렇게 IoC 컨테이너를 직접 쓸 일은 많지 않다.
참고로, Bean으로 등록된 객체는 싱글톤이므로
@GetMapping("/bean")
@ResponseBody
public String bean() {
// OwnerController의 해시값을 볼 수 있다.
return "bean: " + applicationContext.getBean(OwnerRepository.class) + "\n owners: " + owners;
}
이렇게 response를 리턴했을 때, 빈으로 등록된 객체의 해시값과 owners라는 변수에 담긴 객체의 해시값이 동일한 것을 확인할 수 있다. (같은 객체임)
둘다 IoC 컨테이너이지만, 보통 ApplicationContext를 더 많이 사용한다.
ApplicationContext는 ListableBeanFactory 인터페이스를 확장한 인터페이스로, ListableBeanFactory보다 더 많은 기능을 제공한다.
https://www.inflearn.com/course/spring_revised_edition/dashboard