본문 바로가기
Programming/Java

[Spring Framework] AutoWired

by minux_s 2020. 12. 6.
728x90

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이 만들어진 다음에 해야할 일을 적을 수 있다.

 

 

 

 

728x90

'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

댓글