1. AutoWired

2. AutoWired를 생성자 위치에서

3. AutoWired를 Setter 위치에서

4. AutoWired를 필드 위치에서

5. 예외적인 코드로 구성하는 경우

1. AutoWired

1-1) AutoWired

필요한 의존 객체의 '타입'에 해당하는 빈을 찾아 주입함.

Required : 기본값은 true(따라서 못 찾으면 애플리케이션 구동 실패)

1-2) 사용할 수 있는 위치

1-3) 경우의 수

1-4) 같은 타입의 빈이 여러 개일 때

2. AutoWired를 생성자 위치에서

2-1) 해당 빈이 없는 경우

2-1)-1. BookService

Untitled

2-1)-2. BookRepository

→ Bean 주입을 위해 어노테이션을 추가하지 않은 경우

Untitled

2-1)-3. Console

Untitled

2-2) 해당 빈이 있는 경우

2-2)-1. BookRepository

→ @Repository 에노테이션을 해서 Bean을 추가한 경우

→ 위의 경우와 다른 것은 해당 타입의 Bean을 추가하지 않아 오류가 난 거임.

Untitled

2-2)-2. Console

Untitled

3. AutoWired를 Setter 위치에서

3-1) 빈 주입에 실패한 이유

3-1)-1. BookService

Untitled

→ Setter 주입이지만 실패했음. BookSevice라는 인터페이스 자체를 만들 수 있는데,

→ @AutoWired라는 어노테이션이 있기 때문에 이 의존성을 주입하려고 시도함.

→ AutoWired를 하라고 했기 때문에 그 과정을 실패하는 거임.

3-1)-2. Console

Untitled

3-2) @Autowired를 Optional로 할 경우

3-2)-1. BookService

Untitled

→ 의존성 주입이 안 된 상태에서 빈으로만 등록된 상태임.

3-2)-2. Console

Untitled

4. AutoWired를 필드 위치에서

4-1) BookService

Untitled

→ 의존성 주입이 안 된 상태에서 빈으로만 등록된 상태임.

4-2) 해당 빈의 타입이 여러 개인 경우

4-2)-1. interface로 설정한 BookRepository

4-2)-2. Console

Untitled

→ 여기 둘 중에 무엇을 원하는지 Spring은 알 수가 없기 때문에 주입을 할 수 없음.

4-2)-3. 둘 중 주로 사용하고 싶은 Repository에 @Primary 붙여주기

4-2)-4. @PostConstruct

4-3) 해당 타입의 빈 모두 주입 받기

5. 예외적인 코드로 구성하는 경우