package hello.hellospring.controller;
import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
Consider defining a bean of type 'hello.hellospring.service.MemberService' in your configuration.
참고: helloController는 스프링이 제공하는 컨트롤러여서 스프링 빈으로 자동 등록된다.
→@Controller
가 있으면 자동 등록됨
👩🏻💻여기서 생기는 궁금한 점 !
❓ 아무데나 @Component 어노테이션을 붙여도 되나요?
📢 기본적으로는 컴포넌트 스캔이 되지 않습니다.
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
참고: 생성자에
@Autowired
를 사용하면 객체 생성 시점에 스프링 컨테이너에서 해당 스프링 빈을 찾아서 주입한다. 생성자가 1개만 있으면@Autowired
는 생략할 수 있다.
@Repository
public class MemoryMemberRepository implements MemberRepository {}
memberService
와 memberRepository
가 스프링 컨테이너에 스프링 빈으로 등록되었다.참고: 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다 (유일하게 하나만 등록해서 공유한다)
따라서 같은 스프링 빈이면 모두 같은 인스턴스다. 설정으로 싱글톤이 아니게 설정할 수있지만, 특별한 경우를 제외하면 대부분 싱글톤을 사용한다.
@Service
, @Repository
, @Autowired
어노테이션을 제거하고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();
}
}
@Autowired
를 통한 DI는 helloConroller
, memberService
등과 같이 스프링이 관리하는 객체에서만 동작한다.