1) 생성자 주입
class Test {
private int test;
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
}
빈 등록 이후 의존관계 주입
@Autowired(required = false) 지정 시 주입 대상이 없어도 오류가 나지 않음
3) 필드 주입
4) 일반 메서드 주입
AutowiredTest
생성자 주입 권장 이유
✔️ 참고
수정자 주입을 포함한 나머지 주입 방식은 모두 생성자 이후에 호출, 필드에 final 키워드를 사용할 수 없음
생성자 주입 방식만 final 키워드를 사용 가능
✔️ 정리
프레임워크에 의존하지 않고, 순수한 자바 언어의 특징을 잘 살리는 방법
기본으로 생성자 주입을 사용하고, 필수 값이 아닌 경우에는 수정자 주입 방식을 옵션 부여, 생성자 주입과 수정자 주입을 동시에 사용 가능
항상 생성자 주입을 선택 -> 그리고 가끔 옵션이 필요하면 수정자 주입을 선택, 필드 주입은 사용X
@Autowired는 타입으로 조회하기 때문에 같은 타입의 빈이 2개 이상 일 때 NoUniqueBeanDefinitionException 오류 발생
해결방안
1) @Autowired는 기본적으로 타입 매칭을 시도하고, 여러 개의 빈이 있으면 필드이름, 파라미터 이름으로 매칭을 시도
2) @Qualifier는 추가 구분자를 붙이는 방법 -> 이름을 변경하는 것은 아님
참고
@Bean
@Qualifier("mainDiscountPolicy")
public DiscountPolicy discountPolicy(){
return new ...
}
3) @Primary는 우선순위를 정함. @Autowired를 통해 여러번 매칭 시 @Primary 사용하여 우선순위 우위를 부여