Spring/Spring_CoreTechnologies

SpringFrameWork CoreTechnition_section1_2부

whyWhale 2020. 11. 17.

2) @Autowired

 

 Autowired : 필요한 의존 객체 '타입'에 해당하는 빈을 찾아 주입하는 것입니다.

               - 기본적으로 (required=True)  이 들어가 있음.

 

사용 위치

 

가정: bookService 클래스와 bookRepository 라는 두개의 클래스가 있고 bookService 클래스 안에 bookRepository 주입 하려 합니다.

 

 

  • 생성자

bookclass 에 @Repository 선언.

 

# Service Class.

 

@Autowired() // 의존성 주입 @Inject
BookRepository bookRepository;

 

public BookService(BookRepository bookRepository) {
 this.bookRepository = bookRepository;
 }

 

  • setMethod

@Autowired

public void setBookRepository(BookRepository bookRepository)
 {
 this.bookRepository = bookRepository;
 }

 

  • 필드

//required = false
@Autowired() // 의존성 주입 @Inject

BookRepository bookRepository;

 

여러 경우의 수

 

  • 해당 타입이 빈이 없는 경우 -> error bookRepository 에 @Repositoty 등록 안할시. (생성자 ,setter 모두)하지만 Autowired(required=false) 으로 할 경우 실행은 가능 하지만 의존성 주입은 이루어지 않는다.
  • 해당 타입이 빈이 한개인 경우  ->  @Repository 표시하고 Service 부분에서 Autowired를 사용하여 빈을 등록한다.
  • 해당 타입의 빈이 여러 개인 경우

-우선순위 분류

BookRepository class 를 interface 로 변경한 후 A와 B에게 인터페이스를 상속받고

해당 bookRepository를 불러오면 Error가 발생한다. A와 B중 어떤 것을 선택할 지 결정을 해줘야 한다.

해당 빈들 중 우선순위를 분류하기 위해 @Primary 표기롤 덧 붙이거나 또는 @Qualifier( 해당 주입 빈 이름) 

을 표기하도록 한다.

 

-모두 받을 경우 ArrayList 활용하여 List<BookRepository> bookRepositorylist; 선언후 forEach로 출력 가능하다.

               this.bookRepositorylist.forEach(System.out::println); 

 

 

-빈이름으로 시도  -> @Autowired() // 의존성 주입 @Inject
    BookRepository 내가 만들 class ;  <bookRepository 는 인터페이스 | A,B가  implements bookRepository 함.

    @Autowired() // 의존성 주입 @Inject
       BookRepository A 이렇게 선언할 시 A를 주입할 수 있다.

 

전체적인 동작원리

 

BeanPostProcessor (빈 등록된것을 찾는다.) : 새로 만든 빈 인스턴스 수정 하도록 하는 라이플 사이클 인터페이스.

 

AutowiredAnnotationBeanPostProcessor (빈으로 등록 되어 있으며 다른 일반적인 빈들에게 Annotaion의 로직을 처리합니다.) : Autowire , Value, inject 어노테이션 처리기.

 

--> 빈인스턴스를 만들고 빈 초기화라이플사이클 후에 콜백이 일어나게 됩니다.

--> 그러므로 앱이 실행 되고 나서가 아닌 실행 도중에 나타나는 것을 확인 할 수 있습니다.

 

댓글