@Autowired
💡 @Autowired: 자동 주입 기능, 스프링이 알아서 의존 객체를 찾아 주입한다. 의존을 주입할 대상에 애노테이션을 붙이기만 하면 된다.
- @Autowired 애노테이션을 붙이면 설정 클래스에서 의존을 주입하지 않아도 된다.
- 스프링이 해당 타입의 빈 객체를 찾아서 필드에 할당한다.
일치하는 빈이 없는 경우
- 빈이 없는 경우 Error creating bean with name '—-'(UnsatisfiedDependencyException) 같은 에러 메시지가 나온다.
주입 대상에 일치하는 빈이 2개 이상일 경우
@Bean
public MemberPrinter memberPrinter1() {
return new MemberPrinter() ;
}
@Bean
public MemberPrinter memberPrinter2() {
return new MemberPrinter() ;
}
- expected single matching bean but found 2: memberPrinterl,memberPrinter2(UnsatisfiedDependencyException) 같은 에러 메시지가 나온다.
@Qualifier 애노테이션을 이용한 의존 객체 선택
//AppCtx 클래스
@Qualifler("printer")
public MemberPrinter memberPrinter1() {
return new MemberPrinter();
}
@Bean
public MemberPrinter memberPrinter2() {
return new MemberPrinter();
}
//MemberlistPrinter 클래스
@Autowired
@Qualifler( "printer" )
public void setMemberPrinter(MemberPrinter printer) {
this.printer = printer;
}
이 코드에서 memberPrinter1() 메서드에 "printer" 값을 갖는 @Qualifier 애노테이션을 붙였다. 이 설정은 해당 빈의 한정 값으로 "printer” 를 지정한다.
setMemberPrinter() 메서드에 @Autowired 애노테이션을 붙였으므로 MemberPrinter 타입의 빈을 자동 주입한다. 이때 @Qualifier 애노테이션 값이 "printer” 이므로 한정 값이 "printer” 인 빈을 의존 주입 후보로 사용한다.
빈 설정에 @Qualifier 애노테이션이 없으면 빈의 이름을 한정자로 정한다.
@Autowired 애노테이션의 필수 여부
@Autowired 애노테이션은 기본적으로 @Autowired 애노테이션을 붙인 타입에 해당하는 빈이 존재하지 않으면 익셉션을 발생한다.
required=false
자동 주입할 대상이 필수가 아닌 경우에는 스프링 5 버전부터는 @Autowired 애노테이션의 required속성을 false로 지정하면 된다.
@Autowired(required = false)
public void setDateFormatter(DateTimeFormatter dateTimeFormatter) {
this.dateTimeFormatter = dateTimeFormatter;
}
required 속성을 false 로 지정하면 매칭되는 빈이 없어도 익솁션이 발생하지 않으며 자동 주입을 수행하지 않는다.
자바의 Optional
@Autowired
public void setDateFormatter(Optional<DateTimeFormatter> formatterOpt) {
if (formatterOpt. isPresent()) {
this.dateTimeFormatter = formatterOpt.get();
} else {
this.dateTimeFormatter = null;
}
}
자동 주입 대상 타입이 Optional 인 경우, 일치하는 빈이 존재하지 않으면 값이 없는 Optional을 인자로 전달하고(익솁션이 발생하지 않는다), 일치하는 빈이 존재하면 해당 빈을 값으로 갖는 Optional을 인자로 전달한다
@Nullable
@Autowired
public void setDateFormatter(@Nullable DateTimeFormatter dateTimeFormatter) {
this.dateTimeFormatter = dateTimeFormatter;
}
@Autowired 애노테이션을 붙인 세터 메서드에서 @Nullable 애노테이션을 의존 주입 대상 파라미터에 붙이면, 스프링 컨테이너는 세터 메서드를 호출할 때 자동 주입할 빈이 존재하면 해당 빈을 인자로 전달하고, 존재하지 않으면 인자로 null을 전달한다.
required vs @Nuallable
@Nullable 애노테이션을 사용하면 자동 주입할 빈이 존재하지 않더라도 메서드가 호출된다.
required 속성이 false 인데 대상 빈이 존재하지 않으면 세터 메서드를 호출하지 않는다.
📌 자동 주입을 하는 코드와 수동으로 주입하는 코드가 섞여 있으면 주입을 제대로 하지 않아서 NullPointerException 이 발생했을 때 원인을 찾는 데 오랜 시간이 걸릴 수 있다. 의존 자동 주입을 사용한다면 일관되게 사용해야 이런 문제가 줄어든다. 의존 자동 주입을 사용하고 있다면 일부 자동 주입을 적용하기 어려운 코드를 제외한 나머지 코드는 의존 자동 주입을 사용하자.
Reference
초보 웹 개발자를 위한 스프링 5 프로그래밍 입문
'Spring > 스프링5 프로그래밍 입문' 카테고리의 다른 글
Chapter7. AOP 프로그래밍 (0) | 2023.02.22 |
---|---|
Chapter6. 빈 라이프사이클과 범위 (0) | 2023.02.21 |
Chapter5. 컴포넌트 스캔 (0) | 2023.02.21 |
Chapter3. 스프링DI (0) | 2023.02.19 |
Chapter2. 스프링 시작하기 (0) | 2023.02.18 |