2021. 7. 9. 00:12ㆍJAVA/Spring
본 글은 최범균 저자의 초보 웹 개발자를 위한 스프링5 프로그래밍 입문 도서 내용의 복습을 위해 작성된 글입니다.
9. getBean() 메서드 사용
getBean() 메서드의 형식
VersionPrinter versionPrinter = ctx.getBean("versionPrinter", VersionPrinter.class);
getBean 메소드 첫번째 인자 : Bean의 이름
getBean 메소드 두번째 인자 : Bean의 타입
getBean() 메서드의 예외(Exception) 발생 상황
1. Bean의 이름 중 존재하지 않는 Bean 이름의 사용
VersionPrinter versionPrinter = ctx.getBean("versionPrinter2", VersionPrinter.class);
위와 같이 versionPrinter 대신에 versionPrinter2 Bean 이름을 사용하게 되면 예외를 발생시킨다.
2. Bean의 실제 타입과 getBean() 메서드의 두번째 인자에 지정한 클래스 타입이 다른 경우
VersionPrinter versionPrinter = ctx.getBean("listPrinter", VersionPrinter.class);
listPrinter Bean의 실제 타입은 MemberListPrinter 클래스 타입이다. 따라서 위 문장을 컴파일 수행 시 컴파일러는 listPrinter Bean의 이름이 VersionPrinter 클래스 타입을 기대하였지만 실제 타입은 MemberListPrinter 클래스 타입이라고 알려줄 것이다.
3. Bean 이름을 지정하지 않고(첫번째 인자 생략) 타입만으로 Bean을 구하는 경우
VersionPrinter versionPrinter = ctx.getBean(MemberPrinter.class);
단, 해당 타입(MemberPrinter.class)의 Bean 객체가 한 개만 존재하면 빈을 구해서 리턴한다. 해당 타입의 빈 객체가 존재하지 않거나 2개 이상인 경우 예외를 발생시킨다.
10. 주입 대상 객체를 모두 빈 객체로 설정해야 하나?
주입할 객체가 꼭 스프링 빈이어야 할 필요는 없다.
@Configuration
public class AppCtxNoMemberPrinterBean{
private MemberPrinter printer = new MemberPrinter(); // 빈이 아님
...생략
@Bean
public MemberListPrinter listPrinter(){
return new MemberListPrinter(memberDao(), printer);
}
}
위의 설정 코드는 MmeberPrinter를 Bean으로 설정하지 않았다. 하지만 listPrinter 메소드에서 MemberListPrinter 객체 생성과정에서 생성자의 인자로 printer 객체를 사용해서 의존 주입을 수행하는 것을 볼 수 있다. 위와 같이 하여도 MemberListPrinter 객체는 정상 작동한다.
객체의 스프링 빈 등록/미등록 차이
- 스프링 컨테이나가 객체를 관리하는지의 여부
// MemberPrinter를 빈으로 등록하지 않았으므로 의존 주입이 되지 않고 예외가 발생한다.
MemberPrinter printer = ctx.getBean(MemberPrinter.class);
스프링 컨테이너는 자동 주입, 라이프 사이클 관리 제공한다. 단, 빈으로 등록한 객체에만 기능을 적용한다.
정리하며
- getBean() 메서드의 형식은 첫번째 인자는 Bean의 이름, 두번째 인자는 Bean의 타입이 들어간다.
- getBean() 메서드에서 빈의 이름이 존재하지 않거나 Bean의 이름과 타입이 일치하지 않으면 예외가 발생한다.
- 주입 대상 객체를 모두 빈 객체로 설정하는 것은 필수는 아니지만 의존 주입 대상은 스프링 빈으로 등록하는 것이 보통이다.
References
초보 웹 개발자를 위한 스프링5 프로그래밍 입문, 최범균 저
'JAVA > Spring' 카테고리의 다른 글
4. 의존 자동 주입 #2 @Autowired 애노테이션을 이용한 의존 자동 주입 (0) | 2021.07.09 |
---|---|
4. 의존 자동 주입 #1 예제 프로젝트 준비 (0) | 2021.07.09 |
3. 스프링 DI(Dependency Injection) #5 두 개 이상의 설정 파일 사용하기 (0) | 2021.07.06 |
3. 스프링 DI(Dependency Injection) #4 @Configuration 설정 클래스의 @Bean 설정과 싱글톤 (0) | 2021.07.02 |
3. 스프링 DI(Dependency Injection) #3 스프링 DI 설정 (0) | 2021.07.02 |