📚 @Autowired 애노테이션
+ 이 애노테이션을 필드나 세터 메서드에 붙이면 스프링은 타입이 일치하는 빈 객체를 찾아서 주입한다.
public class ChangePasswordService {
// @Autowired를 붙이면 설정 클래스에서 의존 주입할 필요 X
@Autowired
private MemberDao memberDao;
...
}
// AppCtx.java는 설정 클래스이다.
// @Autowired를 붙였으므로 AppCtx 클래스의 @Bean 설정 메서드에서 의존을 주입하는 코드를 삭제하면 된다.
// (주석 처리한 부분)
publid AppCtx {
@Bean
public ChangePasswordService changePwdSvc() {
ChangePasswordService pwdSvc = new ChangePasswordService();
// pwdSvc.setMemberDao(memberDao());
return pwdSvc;
}
...
}
📚 @Qualifier 애노테이션
- 자동 주입 가능한 빈이 두 개 이상이면 자동 주입할 빈을 지정할 수 있는 방법이 필요한데 이 때 사용한다.
- 이 애노테이션을 사용하면 자동 주입 대상 빈을 한정할 수 있다.
- @Qualifier를 넣어주는 두 위치
- @Bean 애노테이션을 붙인 빈 설정 메서드
- 해당 값을 파라미터로 받는 메서드
아래 코드 예시를 확인하자!
1. @Bean 애노테이션을 붙인 설정 메서드
// 저렇게 memberPrinter1과 2로 만들어 @Qualifier 애노테이션 없이 실행시키면
// 해당 타입에 대한 빈을 두 개 발견했다는 에러 메세지가 뜬다.
// 자동 주입을 위해서는 해당 타입을 가진 빈이 어떤 빈인지 정확하게 한정할 수 있어야 한다.
@Bean
@Qualifier("printer")
public MemberPrinter memberPrinter1() {
return new MemberPrinter();
}
@Bean
public MemberPrinter memberPrinter2() {
return new MemberPrinter();
}
2. 해당 값을 파라미터로 받는 메서드
@Autowired
@Qualifier("printer")
public void setMemberPrinter(MemberPrinter printer) {
this.printer =printer;
}
📚 필수 여부 지정하는 방법
1. @Autowired(required = false)
@Autowired(required = false)
public void setDateTimeFormatter(DateTimeFormatter dateTimeFormatter) {
this.dateTimeFormatter =dateTimeFormatter;
}
required = false로 지정하면 매칭되는 빈이 없어도 익셉션이 발생하지 않으며 자동 주입을 수행하지 않는다.
위 코드에서는 DateTimeFormatter 타입의 빈이 존재하지 않으면 익셉션을 발생하지 않고 setDateTimeFormatter() 메서드를 실행하지 않는다.
2. Optional
@Autowired
public void setDateFormatter(Optional<DateTimeFormatter> formatterOpt) {
if (formatterOpt.isPresent()) {
this.dateTimeFormatter =formatterOpt.get();
} else {
this.dateTimeFormatter = null;
}
}
3. @Nullable 애노테이션
@Autowired
public void setDateFormatter(@Nullable DateTimeFormatter dateTimeFormatter) {
this.dateTimeFormatter = dateTimeFormatter;
}
@Nullable 애노테이션을 의존 주입 대상 파라미터에 붙이면,
스프링 컨테이너는 세터 메서드를 호출할 때 자동 주입할 빈이 존재하면 -> 해당 빈을 인자로 전달,
존재하지 않으면 -> 인자로 null을 전달한다.
일치하는 빈이 없으면 할당 자체를 하지 않는 @Autowired(required=false)와 달리 @Nullable 애노테이션을 사용하면 일치하는 빈이 없을 때 null 값을 할당한다. Optional 타입은 매칭되는 빈이 없으면 값이 없는 Optional을 할당한다.
@Autowired 애노테이션을 사용했다면 설정 클래스에서 객체를 주입하기보다는 스프링이 제공하는 자동 주입 기능을 사용하는 것이 좋다. (자동 주입과 수동 주입이 섞여 있으면 익셉션 원인을 찾기 어렵다. 일관되게 사용해야 이런 문제를 줄일 수 있다.)
예제 코드는 아래 깃허브에서 확인 가능합니다!
https://github.com/EvelynKimm/SpringSelfStudy
GitHub - EvelynKimm/SpringSelfStudy: 💻 혼자 Spring 공부하는 Repository
💻 혼자 Spring 공부하는 Repository . Contribute to EvelynKimm/SpringSelfStudy development by creating an account on GitHub.
github.com
'개발 공부 중! > Spring' 카테고리의 다른 글
[스프링5 입문] Chap 07. AOP 프로그래밍 (2) | 2024.01.08 |
---|---|
[스프링5 입문] Chap 06. 빈 라이프사이클과 범위 (0) | 2024.01.07 |
[스프링5 입문] Chap 05. 컴포넌트 스캔 (2) | 2024.01.06 |
[스프링5 입문] Chap 03. 스프링DI (0) | 2024.01.04 |
Spring (0) | 2022.09.28 |