스프링 빈에 등록되면 의존관계가 성립할 수 있다.
1) 컴포넌트 스캔
2) 자바 코드로 직접 스프링 빈 등록
Member controller는 Member service에 의존한다.
spring container는 @Controller annotation을 통해 controller를 인식하여 객체로 만들 수 있지만 우리가 만든 service, repository는 단순 자바 코드이기 때문에 인식할 수 없음
@Controller, @Service, @Repository 모두 컴포넌트의 특수한 케이스이므로, 컴포넌트 스캔으로 스프링 빈에 등록된다.
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
controller 생성자를 통해 controller 객체가 생성될 때 service 객체를 주업해준다.
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
service 객체가 생성될 때 repository 객체를 주입해준다.
: 자동 의존관계 설정
스프링 빈에 등록되지 않은 객체는 @Autowired를 통한 DI가 동작하지 않음
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
DI에는 필드 주입, setter 주입, 생성자 주입이 존재 ▶ 생성자 주입 권장
- 필드 주입 : 스프링이 처음 실행될 때 상태에서 변경할 수 없기 때문에 권장하지 않음
- setter 주입 : 다른 개발자에 의해 호출되어 변경될 수 있기 때문에 권장하지 않음
메모리 리포지토리가 아직 선정되지 않았다고 가정했기 때문에
컴포넌트 스캔 방식 대신 자바 코드로 스프링 빈 설정