직접 스프링 빈 등록하기
@Service, @Repository를 지우고 실행 -> 에러 발생
service 패키지에 SpringConfig 클래스 생성
package hello.hellospring.service;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
Spring이 @Configuration을 읽고 Container에 등록하라고 인식하여
@Bean이 붙은 메서드를 호출하여 Bean에 등록한다.
memberService를 Container에 올리고 memberRepository를 Container에 올린다.
return new MemberService(memberRepository()); 에서 memberRepository()를 호출했으므로
Spring Bean에 등록된 memberRepository를 MemberService에 넣어서 return 한다.
- DI에는 필드 주입, setter 주입, 생성자 주입 3가지 방법이 있다.
의존관계가 실행 중에 동적으로 변하는 경우는 거의 없으므로 생성자 주입을 권장한다. - 실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용한다.
그리고 정형화되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해
스프링 빈으로 등록한다. - @Autowired를 통한 DI는 helloControoler, memberService 등과 같이 스프링이 관리하는 객체에서만 동작한다.
스프링 빈으로 등록하지 않고 직접 생성한 객체에서는 동작하지 않는다.