IOC컨테이너와 빈 (3) : @Autowire

맹기·2021년 3월 17일
0

1. @Autowire

  • 필요한 의존 객체의 "타입"에 해당하는 빈을 찾아 주입한다.
@Service
public class BookService {

    BookRepository bookRepository;

    @Autowired
    public BookService(BookRepository bookRepository) {
        this.bookRepository = bookRepository
    }
}
  • BookRepository가 빈으로 등록되어 있지 않으면 에러이다. (스프링컨테이너가 Autowire할 빈을 찾지 못하기 때문에)
  • BookRepository에 @Repository 또는 @Configuration을 사용하여 빈으로 등록해야지 에러가 안난다.
	@Repository
	public class BookRepository {
	}
  • @Autowired(required = false) 처럼, Autowired 설정을 false로 설정 가능. (Optional함 빈이 있으면 엮어주고 없으면 엮지않는다.)
@Service
public class BookService {

    BookRepository bookRepository;

    @Autowired(required = false)
    public void setBookRepository(BookRepository bookRepository) {
        this.bookRepository = bookRepository;
    }
}
  • setter 설정시에는 BooKRepository를 빈으로 등록하지않아도, @Autowired(required = false)로 설정을하면 에러가 나지 않는다.
  • @Autowired의 required는 기본값이 true이므로, setter로 주입할때 bean등록이 되어있지 않을 때 false로 설정을 안할 경우 주입을 할 수 없기 때문에 에플리케이션 구동에 실패한다.

1.1 @Autowired를 사용할 수 있는 위치

  • 생성자(스프링 4.3 부터는 생략 가능)
  • 세터
  • 필드

1.2 경우의 수

  • 해당 타입의 빈이 없는 경우 (위 코드에 설명)

  • 해당 타입의 빈이 한 개인 경우 (OK)

  • 해당 타입의 빈이 여러 개인 경우

    • 빈 이름으로 시도,
      • 같은 이름의 빈 찾으면 해당 빈 사용

      • 같은 이름 못 찾으면 실패

        public interface BookRepository {}
        
        @Repository
        public class HyunkiBookRepository implements BookRepository{}
        
        @Repository
        public class MyBookRepository  implements  BookRepository{}
  • 같은 타입의 빈이 여러개 일 때 아래의 방법 사용하여 주입 가능하다.

    • @Primary(type safety하기 때문에 이 방법이 가장 좋음)
      @Repository @Primary
          public class HyunkiBookRepository implements BookRepository{}
    • 해당 타입의 빈 모두 주입 받기
      @Repository
          public class BookService{
          	@Autowired
              List<BookRepository> bookRepository;
          }
    • @Qualifier(빈 이름으로 주입)
      @Repository
          public class BookService{
          	@Autowired @Qualifier("hyunkiBookRepository")
              BookRepository bookRepository;
          }
  • 동작원리

    • BeanPostProcessor
      • 새로 만든 빈 인스턴스를 수정할 수 있는 라이프 사이클 인터페이스
    • AutowiredAnnotationBeanPostProcessor extends BeanPostProcessor
      • 스프링이 제공하는 @Autowired와 @Value 어노테이션 그리고 JSR-330의 @Injection 에노테이션을 지원하는 에노테이션 처리기.

0개의 댓글

관련 채용 정보