스프링 빈을 등록하는 두가지 방법
스프링이 실행되면 스프링 컨테이너에 스프링 빈이 등록된다.
그림의 초록 박스가 스프링 빈, 화살표가 의존 관계라 생각하면 된다.
@Component
어노테이션이 있으면 스프링 빈으로 자동 등록된다.
@Controller
, @Service
, @Repository
는 @Component
를 포함하므로 자동 등록된다.
생성자에 @Autowired
를 주입하면 의존 관계가 설정된다.
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
위 그림의 memberController
스프링 빈 생성, memberService
와의 관계 형성.
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
위 그림의 memberService
스프링 빈 생성, memberRepository
와의 관계 형성.
@Repository
public class MemoryMemberRepository implements MemberRepository{}
위 그림의 memberRepository
스프링 빈 생성
@Controller
, @Service
, @Repository
어노테이션
: 스프링 빈 등록 ( 초록 박스 )
@Autowired
: 의존 관계 설정 ( 화살표 )
어노테이션이 아닌, 코드로 직접 스프링 빈을 구현할 수 있다.
별도의 추가 패키지 없이 새 클래스를 만들어 구현했다.
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
memberService
와 memberRepository
를 스프링 빈으로 등록하고, memberService
에서 memberRepository
를 부름으로써 둘을 연결했다고 볼 수 있다.
Controller
는 스프링 실행 시 스프링 빈으로 자동 등록되니 코드로 구현하지 않고, @Component
로 냅두며 @Autowired
로 memberService
와 연결해준다.
주로 정형화된 컨트롤러, 서비스, 리포지토리 코드는 컴포넌트 스캔을 사용한다.
정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 코드를 작성한다.