300x250
※ 정리
- @Autowired 애노테이션을 선언하면, 해당 필드에 해당하는 객체를 찾아서 자동으로 주입을 해준다
- 해당하는 객체가 두개일 경우, @Qualifier를 사용하면 의존 객체를 선택할 수 있다.
- 꼭 의존 주입이 필요없는 경우는 @Autowired(required = false)를 사용한다.
package chap03.config;
import chap03.spring.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration //스프링 설정 클래스
public class AppCtx {
@Bean //MemberDao라는 이름으로 스프링에 주입
public MemberDao memberDao(){
return new MemberDao();
}
@Bean
public ChangePasswordService changePwdSvc(){
ChangePasswordService pwdSvc = new ChangePasswordService();
pwdSvc.setMemberDao(memberDao()); // 의존주입
return pwdSvc;
}
}
위 코드에서 객체로 등록한 changePwdSvc() 에서 memberDao()를 의존 주입하고 있다.
의존 자동 주입 (@Autowired)
- @Autowired를 필드에 붙이면 설정 파일에서 해당 타입의 빈 객체를 찾아서 필드에 할당한다.
- 필드에 자동으로 memberDao를 주입했기 때문에 설정파일에서는 의존 주입을 해주지 않아도 된다.
@Bean
public ChangePasswordService changePwdSvc(){
ChangePasswordService pwdSvc = new ChangePasswordService();
//pwdSvc.setMemberDao(memberDao()); // 자동으로 의존 주입이 됬으니 삭제해도 됌
return pwdSvc;
}
ㅁ @Autowired 주입 대상에 일치하는 빈이 두개 이상이면??
- 의존 타입의 객체가 여러개이면 자동 주입에 실패하고 익셉션이 발생된다.
- 자동 주입을 하려면 해당 타입을 가진 빈이 어떤 빈인지 정확하게 한정할 수 있어야한다.
@Bean
public MemberPrinter memberPrinter()
{
return new MemberPrinter();
}
@Bean
public MemberPrinter memberPrinter2()
{
return new MemberPrinter();
}
ㅁ @Qualifier 의존 객체 선택
- @Qualfier로 자동 주입할 빈을 지정 가능하다.
@Bean
@Qualifier("printer")
public MemberPrinter memberPrinter()
{
return new MemberPrinter();
}
@Bean
public MemberPrinter memberPrinter2()
{
return new MemberPrinter();
}
- 자동 주입 시 @Qualfier 애노테이션을 사용해서 printer라는 값을 설정
- 설정파일에서 빈으로 등록 된 객체 중 @Qualiter이 printer로 선언 된 함수를 찾아 실행된다.
ㅁ @Autowird 필수 여부
- ( @Autowired(required = false))
package chap04.spring;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.format.DateTimeFormatter;
import java.util.Optional;
public class MemberPrinter {
private DateTimeFormatter dateTimeFormatter;
public MemberPrinter() {
dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy년 MM월 dd일");
}
public void print(Member member) {
if (dateTimeFormatter == null) { //null인 경우에도 알맞게 동작되기 때문에 setDataFormatter()을 통해서 의존 객체를 주입할 필요는 없다
System.out.printf(
"회원 정보: 아이디=%d, 이메일=%s, 이름=%s, 등록일=%tF\n",
member.getId(), member.getEmail(),
member.getName(), member.getRegisterDateTime());
} else {
System.out.printf(
"회원 정보: 아이디=%d, 이메일=%s, 이름=%s, 등록일=%s\n",
member.getId(), member.getEmail(),
member.getName(),
dateTimeFormatter.format(member.getRegisterDateTime()));
}
}
public void setDateFormatter(DateTimeFormatter dateTimeFormatter) {
this.dateTimeFormatter = dateTimeFormatter;
}
}
print() 함수를 살펴 보면 dataTimeFormatter이 null인 경우에도 알맞게 동작되기 때문에 setDataFormatter()을 통해서 의존 객체를 주입할 필요는 없다. 하지만 @Autowired의 경우는 해당하는 빈이 꼭 존재해야 하므로 익셉션이 발생된다.
- 꼭 자동 주입할 대상이 필수가 아닌 경우는 자동 주입 속성을 flase로 지정한다.
- 매칭되는 빈이 없어도 익셉션이 발생하지 않고 자동 주입을 수행하지 않는다.
@Autowired(required = false)
public void setDateFormatter(DateTimeFormatter dateTimeFormatter) {
this.dateTimeFormatter = dateTimeFormatter;
}
REFERENCE
초보 웹 개발자를 위한 스프링 5 프로그래밍 입문(최범균)
300x250
'공부 > Spring' 카테고리의 다른 글
[Spring] Chapter 07 - Spring AOP (0) | 2021.06.13 |
---|---|
[Spring] Chapter 06 - 빈라이클사이클과 범위 (0) | 2021.06.13 |
[Spring] Chapter 05 - 컴포넌트 스캔 (0) | 2021.06.13 |
[Spring] Chapter 03 - 스프링 DI(Dependency Injection) (0) | 2021.06.13 |
[Spring]Chapter 02 - 스프링 시작하기 (1) | 2021.06.13 |