생성자나 세터 등을 사용하여 의존성 주입을 하려고 할 때, 해당 빈을 찾아서 주입해주는 annotation이다.
required 값을 ture나 false로 줄 수 있다.
true인 경우는 의존성주입에 필요한 객체가 무조건 bean으로 등록되어있어야한다. @Autowired
or @Autowired(required = true)
false인 경우는 예를 들어, setter의 파라미터가 주입 되어야되는 경우, bean등록이 안되어있어도, 오류가 나지않고 인스턴스는 만들어준다.
@Autowired(required = false)
default값은 true이다.
만약 RoomService라는 객체가 있고, 그 객체에서 RoomRepository를 사용하기 위해 의존성 주입을 받아야한다고 가정하고, RoomRepository는 interface로 만들어주고, RoomRepository를 implements 하는 2개의 Repository가 있다고 한다.
이 경우 그냥 @Autowired를 사용해서 의존성 주입을 받으려고 하면, spring은 둘 중 어느 Repository가 사용되야하는지 모르기 때문에, 에러가 난다.
이렇게 동일한 타입의 빈이 여러개인 경우, 3가지 방법이 있다.
1. @Primary
2. @Qualifier
3. 동일 타입의 모든 Bean 리스트로 받아오기
동일한 타입의 빈들 중 하나에 @Primary annotation을 붙여준다. 그럼 그 빈이 우선권을 가지게 되어, 프로그램 실행 시, 해당 Bean으로 의존성주입을 받아온다.
RoomRepositoryOne에 @Primary annotation을 추가해주면, 에러없이 실행됨을 볼 수 있다.
빈의 id값으로 어떤 bean을 사용할지 정해준다. 이 경우는 의존성 주입 해주는 쪽, 즉 @Autowired를 사용하고 있는 곳에 해준다. 빈의 id는 의존성 주입을 받아와야하는 타입의 클래스 명의 맨 앞 글자를 소문자로 바꾼 것이다.
아래의 RoomRepositoryOne의 bean id 값은 roomRepositoryOne이다.
따라서, 아래와 같이 사용할 수 있다.
List를 사용하여 같은 타입의 bean들을 모두 리스트에 담아주고 사용하는 것이다.
*@PostConstruct 라는 annotation을 이용하여 List를 출력해보았는데, @PostConstruct는 딱 한 번만 실행되는 Bean의 lifecycle로, @Autowired로 의존성주입이 일어난 후, 시행되게 만들어주는 annotation이다. 생성자의 경우는 bean의 의존성주입이 아직 일어나지 않지만, @PostConstruct는 의존성주입이 일어난 후이다.