MemberController.java
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
MemberService.java
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
MemoryMemberRepository.java
@Repository
public class MemoryMemberRepository implements MemberRepository {
먼저 모든 class에 대해서 위에 Controller, Service, Repository annotation을 붙힌다. 여기서 대제목이 component 스캔인데 이 이유는 위 3가지의 annotaion을 들어가보면 모두 Component annotation을 포함하고 있기 때문이다.
Spring이 처음에 빌드를 시작할 때 Component annotation을 포함하고 있는 class들을 찾아서 Spring bean으로 등록한다.
DI를 주입할 때도 이전 챕터에서 생성자 주입을 이용한다고 하였는데 이 경우에도 결국엔 Autowired annotation을 이용해서 등록해야 한다.
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemoryMemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
class에 Configuration annotation을 지정하고 class 내부에 Bean anntation을 이용해서 Spring bean으로 등록한다. 기존에 Autowired를 이용해서 의존관계를 주입하던 방식도 위에서는 annotation을 이용하지 않고 생성자로 등록한다.
Controller는 어쩔 수 없게도 Spring이 알아서 관리하기 때문에 Configuration 하위에 등록하지 않는다. 그러므로 Controller는 그대로 둔다.
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}