@Autowired
를 이용한 의존 자동 주입자동 주입 기능을 사용하면 Spring이 알아서 의존 객체를 찾아서 주입한다.
의존을 주입할 대상에 @Autowired
애노테이션을 붙이기만 하면 된다.
import org.springframework.beans.factory.annotation.Autowired;
public class ChangePasswordService {
@Autowired
private MemberDao memberDao;
public void changePassword(String email, String oldPwd, String newPwd) {
Member member = memberDao.selectByEmail(email);
if (member == null)
throw new MemberNotFoundException();
member.changePassword(oldPwd, newPwd);
memberDao.update(member);
}
public void setMemberDao(MemberDao memberDao) {
this.memberDao = memberDao;
}
}
@Autowird
를 붙이면 설정 클래스에서 의존을 주입하지 않아도 된다. 필드에 이 애노테이션이 붙어 있으면 스프링이 해당 타입의 빈 객체를 찾아서 필드에 할당한다.
메소드에도 마찬가지로 @Autowird
를 붙일 수 있다. 이 경우, 해당 메소드에 일치하는 타입을 가진 빈이 주입된다.
@Autowird
애노테이션을 적용한 대상에 일치하는 빈이 없다면, 예외가 발생하면서 제대로 실행되지 않는다.
Exception in thread "main" o ..(중략)
UnsatisfiedDependencyException:
Error creating bean with name 'memberRegSvc':
Unsatisfied dependency expressed through field 'memberDao';
nested exception is o .. (중략).
NoSuchBeanDefinitionException:
No qualifying bean of type 'spring.MemberDao' available:
expected at least 1 bean which qualifies as autowire candidate.
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
@Autowired
를 붙인 MemberRegisterService의 memberDao 필드에 주입할 MemberDao 빈이 존재하지 않아 에러가 발생했다는 내용이다.
@Autowired
를 붙인 주입 대상에 일치하는 빈이 두 개 이상일 때도 예외가 발생한다.
@Bean
public MemberPrinter memberPrinter1() {
return new MemberPrinter();
}
@Bean
public MemberPrinter memberPrinter2() {
return new MemberPrinter();
}
이 경우 빈이 중복되어 자동 주입을 할 때 어떤 빈을 주입해야 하는지 정확하게 한정이 안되는 문제가 생긴다.
Exception in thread "main" o..(중략)
UnsatisfiedDependencyException: Error creating bean with name 'listPrinter':
Unsatisfied dependency expressed through method 'setMemberPrinter' parameter 0;
nested exception is o.(중략)
NoUniqueBeanDefinitionException: No qualifying bean of type 'spring.MemberPrinter' available:
expected single matching bean but found 2: memberPrinter1, memberPrinter2
@Qualifier
를 이용한 의존 객체 선택자동 주입이 가능한 빈이 두 개 이상이면 자동 주입할 빈을 지정할 수 있는 방법이 필요하다.
@Qualifier
애노테이션을 사용하면 자동 주입 대상 빈을 한정할 수 있다.
@Qualifier
: 빈의 이름을 한정자로 지정@Qualifier("한정값")
: 파라미터에 들어가는 "한정값"으로 빈을 등록