※ 본 게시글은 인프런 스프링 핵심 원리 - 기본편 강의를 바탕으로 작성하였습니다.
강의 내용을 참고하여 개인적으로 정리한 글입니다.
스프링 컨테이너가 무엇인가?
ApplicationContext
를 스프링 컨테이너라 부른다AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); //컨테이너 생성
@Bean
이 붙은 메서드의 메서드명이 빈 이름@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
} // 빈 이름은 `memberService`
@Bean(name = "memberService")
이런식으로 직접 이름 지정도 가능만약 빈 이름이 중복되면 오류가 발생하거나 기존 빈을 덮어쓸 수 있으니 주의하자
1. 모든 빈 조회하기
ac.getBeanDefinitionNames()
→ 스프링에 등록된 모든 빈 이름을 조회ac.getBean()
→ 빈 이름으로 빈 객체(인스턴스) 조회2. 애플리케이션 빈 조회하기
사용자가 직접 등록한 빈만 출력해보자
getRole()
로 구분이 가능ROLE_APPLICATION
→ 사용자가 정의한 빈ROLE_INFRASTRUCTURE
→ 스프링 내부에서 사용하는 빈3. 빈 이름으로 조회하기
ac.getBean("memberService", MemberService.class); // `ac.getBean`(이름 + 타입)
4. 타입으로만 조회하기
ac.getBean(MemberService.class); // 타입만
5. 구체 타입으로 조회하기
ac.getBean(MemberServiceImpl.class); // 구체 타입
6. 빈 이름으로 조회하지 못하는 경우
NoSuchBeanDefinitionException
예외 발생@Configuration
static class SameBeanConfig {
@Bean
public MemberRepository memberRepository1() {
return new MemoryMemberRepository();
}
@Bean
public MemberRepository memberRepository2() {
return new MemoryMemberRepository();
}
}
1. 이름으로 조회하기
ac.getBean("memberRepository1", MemberRepository.class);
2. getBeansOfType()
으로 모두 조회하기
Map<String, MemberRepository> beansOfType = ac.getBeansOfType(MemberRepository.class);
Object
타입으로 조회 → 모든 스프링 빈 조회DiscountPolicy
로 조회 → RateDiscountPolicy
, FixDiscountPolicy
모두 걸림이때도 동일한 타입이 둘 이상 있을 때 처럼 빈 이름을 지정해서 조회하거나,
getBeansOfType()
으로 모두 조회 하면 된다
구분 | BeanFactory | ApplicationContext |
---|---|---|
빈 관리 | O | O |
부가 기능 | X | O |
이전까지는 내가 직접 new
로 객체를 만들고 연결하면 끝이었는데 스프링으로 넘어오면서 객체 생성과 의존 주입을 컨테이너가 대신 알아서 해주니 내가 통제하던 제어권을 프레임워크에 넘긴다는 게 매우 어렵게 느껴졌다 하지만 강의 들으면서 스프링의 구조를 이해하고 나니 스프링을 왜 큰 규모에서 사용하는 것인지 체감이 되는 것 같았다
다음 포스팅은 싱글톤 컨테이너로 넘어오겠댜