@Autowired란

생성자나 세터 등을 사용하여 의존성 주입을 하려고 할 때, 해당 빈을 찾아서 주입해주는 annotation이다.

option

required 값을 ture나 false로 줄 수 있다.
true인 경우는 의존성주입에 필요한 객체가 무조건 bean으로 등록되어있어야한다. @Autowired or @Autowired(required = true)
false인 경우는 예를 들어, setter의 파라미터가 주입 되어야되는 경우, bean등록이 안되어있어도, 오류가 나지않고 인스턴스는 만들어준다.
@Autowired(required = false)
default값은 true이다.

같은 타입의 Bean이 여러개인 경우

만약 RoomService라는 객체가 있고, 그 객체에서 RoomRepository를 사용하기 위해 의존성 주입을 받아야한다고 가정하고, RoomRepository는 interface로 만들어주고, RoomRepository를 implements 하는 2개의 Repository가 있다고 한다.

스크린샷 2020-01-08 오전 3.01.31.png

스크린샷 2020-01-08 오전 3.02.37.png

스크린샷 2020-01-08 오전 3.03.47.png

스크린샷 2020-01-08 오전 3.03.56.png

이 경우 그냥 @Autowired를 사용해서 의존성 주입을 받으려고 하면, spring은 둘 중 어느 Repository가 사용되야하는지 모르기 때문에, 에러가 난다.

스크린샷 2020-01-08 오전 3.05.26.png

이렇게 동일한 타입의 빈이 여러개인 경우, 3가지 방법이 있다.
1. @Primary
2. @Qualifier
3. 동일 타입의 모든 Bean 리스트로 받아오기

@Primary

동일한 타입의 빈들 중 하나에 @Primary annotation을 붙여준다. 그럼 그 빈이 우선권을 가지게 되어, 프로그램 실행 시, 해당 Bean으로 의존성주입을 받아온다.

RoomRepositoryOne에 @Primary annotation을 추가해주면, 에러없이 실행됨을 볼 수 있다.

스크린샷 2020-01-08 오전 3.07.52.png

@Qualifier

빈의 id값으로 어떤 bean을 사용할지 정해준다. 이 경우는 의존성 주입 해주는 쪽, 즉 @Autowired를 사용하고 있는 곳에 해준다. 빈의 id는 의존성 주입을 받아와야하는 타입의 클래스 명의 맨 앞 글자를 소문자로 바꾼 것이다.

아래의 RoomRepositoryOne의 bean id 값은 roomRepositoryOne이다.
스크린샷 2020-01-08 오전 3.12.48.png

따라서, 아래와 같이 사용할 수 있다.

스크린샷 2020-01-08 오전 3.14.25.png

동일 타입의 모든 Bean 리스트로 받아오기

List를 사용하여 같은 타입의 bean들을 모두 리스트에 담아주고 사용하는 것이다.

스크린샷 2020-01-08 오전 3.44.19.png

*@PostConstruct 라는 annotation을 이용하여 List를 출력해보았는데, @PostConstruct는 딱 한 번만 실행되는 Bean의 lifecycle로, @Autowired로 의존성주입이 일어난 후, 시행되게 만들어주는 annotation이다. 생성자의 경우는 bean의 의존성주입이 아직 일어나지 않지만, @PostConstruct는 의존성주입이 일어난 후이다.

0개의 댓글