[기본] 스프링 빈 조회

이전 포스팅

스프링 빈 등록 방법은 두가지가 있다.

  1. 수동등록 - Config 클래스에서 @Bean 으로 등록
  2. 자동등록 - Config 클래스에 @ComponentScan. 각 클래스에 @Component. 의존성주입은 @Autowired로 해결.

등록된 빈은 스프링 컨테이너에 저장된다. @Autowired는 필요한 빈을 조회하여 해당 클래스의 필드에 주입하여준다.

테스트 코드 등에서 빈을 찾아 사용해야할 경우 컨테이너에서 어떻게 빈을 조회할까?


스프링 빈 조회 - 기본

@Bean
MemberService memberSerivce() {
	return new MemberServiceImpl();
}

1. 타입으로 조회

Member memberService = ac.getBean(MemberService.class);

인터페이스 타입으로 조회가 가능하다.

2. 구체 타입으로 조회

Member memberService = ac.getBean(MemberServiceImpl.class);

구현 클래스의 타입으로도 조회가 가능하나 DIP 원칙을 위배시키므로 잘 사용하지 않는다.

3. 빈 이름으로 조회

Member memberService = ac.getBean("memberService", MemberService.class);

빈 이름으로 조회시 빈 이름과 구현클래스를 함께 파라미터로 넘긴다.



스프링 빈 조회 - 동일 타입 둘 이상

@Bean
MemberService memberSerivce1() {
	return new MemberServiceImpl();
}

@Bean
MemberService memberSerivce2() {
	return new MemberServiceImpl();
}

1. 타입으로 조회

Member memberService = ac.getBean(MemberService.class);

MemberService 타입 빈이 memberService1, memberService2 두개가 있으므로 중복 오류가 발생한다.

2. 빈 이름으로 조회

Member memberService = ac.getBean("MemberService1" MemberService.class);

빈 이름은 중복되지 않게 저장하는 것이 중요하다. 동일 타입 둘 이상이어도 이름이 달라 조회가 가능하다.

3. 특정 타입 모두 조회

Map<String, MemberService> beans = ac.getBeansOfType(MemberService.class);

getBeansOfType 메서드를 통해 해당 타입의 모든 빈을 Map에 저장할 수 있다.


4. 부모 타입으로 조회

Map<String, Object> allbean = ac.getBeansOfType(Object.class);

부모 타입으로 조회시 모든 자식 타입도 함께 조회된다. 모든 자바 객체의 최고 부모인 Object 타입으로 조회시 모든 스프링 빈이 조회된다.


getBean(이름, 타입) 으로 빈을 조회할 수 있다. 부모 타입 조회시 모든 자식 타입도 함께 조회됨에 유의한다. 특정 타입을 모두 조회할 경우 getBeansOfType 메서드로 조회하여 Map<String, 타입> 에 저장할 수 있다.



본 글은 김영한님의 "스프링 핵심 원리 - 기본편" 강의내용 및 이해한 내용을 정리한 것입니다.

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8

좋은 웹페이지 즐겨찾기