-
스프링 빈 : 스프링 IoC 컨테이너가 관리하는 객체
-
스프링 IoC 컨테이너 : 빈을 관리하는 객체
-
의존성 주입
- 직접 의존성 주입 : 어디선가 new 키워드 사용하여 객체 생성 필요
- 의존성 주입을 위한 필요 객체 수가 많아 진다면 복잡성 커지고 중복 생성이 많아짐
- 모든 의존관계를 파악해야 하는 번거로움이 생김
- 많은 객체가 중복 생성될 수도 있음
- A 생성 : B, C, D 필요
- B 생성 : E, F 필요
- E 생성 : .. 필요
- ...
- 빈으로 등록하여 스프링 IoC 컨테이너가 객체의 생성과 의존성 주입 관리필요
- 주입된 의존성을 사용하는 것에만 집중할 수 있음
-
스프링IoC 컨테이너 생성 -> 빈 스코프가 싱글톤인 객체 생성 -> 빈 데피니션 생성(어노테이션 또는 자바 컨피그 또는 XML 기반) -> 빈으로 등록할 POJO + 빈 데이피니션 정보를 이용하여 빈 생성(싱글톤이 아닌 평범한 자바 클래스 이용)
-
IoC 컨테이너 : 싱글톤 레지스트리 기능 존재
- 빈 스코프가 싱글톤인 객체에 빈의 이름을 Key로, 객체를 value로 저장
- 의존성이 주입 되어야하는 객체가 빈으로 등록되어 있을 때 스프링은 빈의 이름을 이용하여 항상 동일한 Single Object반환
-
빈 객체가 생성 되면 IoC 컨테이너는 의존 설정을 한다.(의존성 자동 주입 일어남)
-
빈 설정시 주의점 : 빈 스코프를 싱글톤으로 가질 경우 상태를 가지면 안됨
- ex) 스레드 1에서 증가 / 스레드 2에서 get -> 얻어올 때마다 상태가 달라짐
-
상태를 가질 수 있는 빈 : 생성, 존재, 적용 범위 지정 가능(빈 스코프)
- @scope로 설정 가능
- 디폴트는 싱글톤타입 /
프로토타입
이라는 스코프 있음
프로토타입
으로 생성할 경우 요청이 올 때마다 객체가 생성됨
- 모든 스레드에서 공유하는 것이 아니므로 해당 객체는 상태를 가질 수 있음
-
의존성을 자동 주입 해야 할 인터페이스에 구현체가 두 개 이상이라면 어떤 구현체를 주입할지 몰라 충돌이 일어남
- 어노테이션 사용으로 우선순위 지정 가능
- 의존성 주입 구현체 하나일 경우 @Primary 우선순위 지정하여 지정 가능
- 상황에 따라 다른 구현체를 자동 주입 되도록 할 수 있음
- 의존성 주입이 필요한 곳에 @Qualifier(빈이름) 어노테이션 사용하여 특정 구현체를 주입하도록 설정할 수 있음