@Autowired를 이용한 자동 객체 주입
-
방법1 : Field에 적용
1public class MemberListPrinter { 2 @Autowired 3 private MemberDao memberDao; 4 @Autowired 5 private MemberPrinter printer; 6 7 public MemberListPrinter() {} 8 9 public void printAll() { 10 Collection<Member> members = memberDao.selectAll(); 11 members.forEach(m -> printer.print(m)); 12 } 13}
-
방법2 : Method에 적용
1public class MemberListPrinter { 2 private MemberDao memberDao; 3 private MemberPrinter printer; 4 5 public MemberListPrinter() {} 6 7 @Autowired 8 public void setMemberDao(MemberDao memberDao) { 9 this.memberDao = meberDao; 10 } 11 @Autowired 12 public void setMemberPrinter(MemberPrinter memberPrinter) { 13 this.printer = printer; 14 } 15 16 public void printAll() { 17 Collection<Member> members = memberDao.selectAll(); 18 members.forEach(m -> printer.print(m)); 19 } 20}
-
결과
1@Bean 2public MemberListPrinter listPrinter() { 3 // 일일이 객체를 주입할 필요가 없다 4 return new MemberListPrinter(); 5}
@Qualifier
- AppCtx.java
1@Bean 2@Qualifier("printer") 3public MemberPrinter memberPrinter() { 4 return new MemberPrinter(); 5}
- MemberListPrinter.java
1@Autowired 2@Qualifier("printer") 3private MemberPrinter printer;
- 자동 주입 가능한 빈이 두 개 이상일 때 특정 빈을 한정하기 위해 사용한다
- 필드, 메소드 둘 다 사용 가능하다
- @Qualifier annotation이 없으면 빈의 이름을 한정자로 지정한다
@Autowired의 필수 여부를 지정하는 방법
- 의존 객체를 꼭 주입할 필요가 없는 경우가 있다
- 아래의 세 방법은 필드에도 적용 가능하다
- required=false
1@Autowired(required = false) 2public void setDateFormatter(DateTimeForMatter formatterOpt) {...}
- 일치하는 빈이 없으면 할당을 자체를 하지 않음
- Optional
1@Autowired() 2public void setDateFormatter(Optional<DateTimeFormatter> formatterOpt) { 3 if (formatterOpt.isPresent()) { 4 this.dateTimeFormatter = formatterOpt.get(); 5 } 6 else { 7 this.dateTimeFormatter = null; 8 } 9}
- 일치하는 빈이 없으면 값이 없는 Optional을 할당
- @Nullable
1@Autowired 2public void setDateFormatter(@Nullable DateTiemFormatter formatterOpt) {...}
- 일치하는 빈이 없으면 null값을 전달
자동 주입, 명시적 의존 주입
- 둘 다 수행한 경우 자동 주입을 통해 빈을 주입한다
- 자동 주입, 명시적 수동 주입을 섞어서 사용하지 말자