bong-u/til

Spring 개념 - Autowired

수정일 : 2024-11-15

@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의 필수 여부를 지정하는 방법

  • 의존 객체를 꼭 주입할 필요가 없는 경우가 있다
  • 아래의 세 방법은 필드에도 적용 가능하다
  1. required=false
    1@Autowired(required = false)
    2public void setDateFormatter(DateTimeForMatter formatterOpt) {...}
    
    • 일치하는 빈이 없으면 할당을 자체를 하지 않음
  2. 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을 할당
  3. @Nullable
    1@Autowired
    2public void setDateFormatter(@Nullable DateTiemFormatter formatterOpt) {...}
    
    • 일치하는 빈이 없으면 null값을 전달

자동 주입, 명시적 의존 주입

  • 둘 다 수행한 경우 자동 주입을 통해 빈을 주입한다
  • 자동 주입, 명시적 수동 주입을 섞어서 사용하지 말자