BookService는 @Service로 bean을 등록해놓고, BookRepository는 아직 bean으로 등록하지 않았을 때, @Autowired를 통해 의존성을 주입한다 가정
1) 생성자
@Autowired
public BookService(BookRepository bookRepository){
this.bookRepository = bookRepository;
}
이 코드는 아직 bookrepository가 bean으로 등록되어 있지 않기 때문에 에러가 난다.
따라서 bookRepository에 @Repository를 붙여주면 해결!
2) setter
BookREpository bookRepository;
@Autowired
public void setBookRepository(BookRepository bookRepository){
this.bookRepository = bookRepository;
}
이러면 setter주입이지만 bookRepository가 bean으로 등록 안되어 있기에 실패.
여기서 알 수 있는 것은 setter라서 적어도 bean은 만들수 있는거 아닌가..? bookService 자체의 인스턴스는 만들 수 있는거 아닌가..? 맞다
bookservice라는 인스턴스 자체는 만들 수 있는데, @Autowired가 있기 때문에 의존성을 주입하려고 시도한다. 이 과정이 실패!
만약 의존성이 optional이라면 @Autowired(required = false) 로 바꾸면 된다.
이러면 인스턴스만 만들어서 bean으로 등록이 된 것이고, bookRepository는 의존성 주입 안 된 상태로 bean이 등록이 되었다.
3)field
@Autowired(required = false)
BookRepository bookRepository
이렇게되면 아까 한 생성자를 사용한 의존성 주입에 비해 다르다.
생성자를 사용한 의존성 주입은 이 bean을 만들 때에도 개입이 된다. 그 생성자에 전달 받아야하는 bean의 타입에 해당하는 bean이 없으면 무조건 인스턴스를 만들지 못하고 bookService도 등록이 안된다.
하지만 setter나 field를 이용하면 optional로 설정해서 bookserivce가 해당하는 의존성 없이도 bean으로 등록되게 할 수 있다.
만약 bookRepository에
public interface BookRepository{
}
@Repository
public class MyBookRepository implements BookRepository{
}
@Repository
public class yourbookRepository implements BookRepository{
}
이렇게 bookrepository 타입의 bean이 2개가 있을때, bookservice에 그냥 bookRepository를 주입하면 둘 중 어떤 걸 원하는지 모르기 때문에 에러가 난다
해결책은 4가지로
1) @Primary - 그 중에 사용하고픈 bean에 마킹 추천!
2) 모든 bean 받기
ex) @Autowired
List<BookRepository> bookRepositorys;
3) @Qualifier로 마킹하기 ex) @Qualifier("MyBookRepository") Primary가 더 났다...
4) @Autowired BookRepository myBookRepository 로 쓸 애 딱 집어 넣기
- 동작원리는
beanPostProcesser라는 라이프사이클 인터페이스의 구현체에 의해서 동작 가능
beanPostProcessor란 bean을 만든 다음에 bean의 초기화 라이프사이클이 있음.(initialization)
이 라이프 사이클 이전, 또는 이후에 어떤 부가적인 작업을 할 수 있는 라이크사이클 콜백이 beanPostProcessor interface이다.
initialization란 @PostConstruct을 붙여서 정의 해서 이 bean이 만들어진 다음에 해야할 일을 적을 수 있다.
'Programming > Java' 카테고리의 다른 글
[Spring Framework] Bean의 Scope (0) | 2020.12.22 |
---|---|
[Spring Framework] IOC Container (0) | 2020.12.06 |
[Spring Framework] 스프링 소개 (0) | 2020.12.02 |
[petclinic] PSA (0) | 2020.11.28 |
[petclinic] AOP 소개 (0) | 2020.11.28 |
댓글