들어가기 앞서 사용한 스프링 컨테이너 구현체는
AnnotationConfigApplicationContext이다.
예제로 나온ac는ApplicationContext ac = new AnnotationConfigApplicationContext이다.
ac.getBean("빈이름") : 빈이름에 해당되는 인스턴스 조회ac.getBean("빈이름", 클래스명.calss) : 타입까지 지정, 반환타입 결정예제
@Test
void findBeanByName(){
Object bean = ac.getBean("myBean");
//MyBean bean = ac.getBean("myBean", MyBean.class); - 타입까지 지정
System.out.println("bean = " + bean);
Assertions.assertThat(bean).isInstanceOf(RedMyBean.class);
}
ac.getBean(클래스명.calss) : 해당 타입의 인스턴스 조회예제
@Test
void findBeanByType(){
//스프링 컨테이너에 해당 타입 1개만 있으면 타입으로만 조회 가능
MyRepository bean1 = ac.getBean(MyRepository.class);
System.out.println("bean = " + bean1);
Assertions.assertThat(bean1).isInstanceOf(MemoryMyRepository.class);
}
NoUniqueBeanDefinitionException 예외 발생예제 - 구현체 클래스 단위로 조회해보기
@Test
void findBeanByType(){
//같은 타입이 2개 이상 있는 경우 이름 지정
MyBean bean2 = ac.getBean("myBean", MyBean.class);
System.out.println("bean2 = " + bean2);
Assertions.assertThat(bean2).isInstanceOf(RedMyBean.class);
}
ac.getBeanDefinitionNames() : 스프링에 등록된 모든 빈 이름 조회ac.getBean("빈이름") : 빈 이름으로 빈 인스턴스 조회예제
@Test
void findAllBean(){
String[] names = ac.getBeanDefinitionNames();
for (String name : names) {
Object bean = ac.getBean(name);
System.out.println("bean = " + bean);
}
}
실행 결과
bean = org.springframework.context.annotation.ConfigurationClassPostProcessor@2d778add
bean = org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor@73302995
bean = org.springframework.context.annotation.CommonAnnotationBeanPostProcessor@1838ccb8
bean = org.springframework.context.event.EventListenerMethodProcessor@6c2ed0cd
bean = org.springframework.context.event.DefaultEventListenerFactory@7d9e8ef7
bean = test.core.AppConfig$$EnhancerBySpringCGLIB$$a8475dc7@f107c50
bean = test.core.bean.RedMyBean@51133c06
bean = test.core.reopsitory.MemoryMyRepository@4b213651
bean = test.core.bean.GreenMyBean@4241e0f4
ac.getBeanDefinition("빈 이름") : 빈의 메타 정보 불러옴AnnotationConfigApplicationContext 어야 함AnnotationConfigApplicationContext ac = new ...getRole() : 빈의 종류 구별ROLE_APPLICATION : 내가 등록한 빈ROLE_INFRASTRUCTURE : 스프링 배부에서 사용하는 빈예제
@Test
void findAllMyBean(){
String[] names = ac.getBeanDefinitionNames();
for (String name : names) {
BeanDefinition beanDefinition = ac.getBeanDefinition(name);
if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION){
Object bean = ac.getBean(name);
System.out.println("bean = " + bean);
}
}
}
실행 결과
bean = test.core.AppConfig$$EnhancerBySpringCGLIB$$a8475dc7@2d778add
bean = test.core.bean.RedMyBean@73302995
bean = test.core.reopsitory.MemoryMyRepository@1838ccb8
bean = test.core.bean.GreenMyBean@6c2ed0cd
특정 타입의 스프링 빈을 모두 조회하고 사용하고 싶을 때 Map, List를 사용하면 된다.
Map<string, 특정타입> 으로 받아온다.List<특정타입>으로 받아온다.예제 - 특정 타입 모두 가져오는 클래스
@Component로 스프링 빈에 등록@Component로 스프링 빈에 등록@Component로 스프링 빈에 등록@Component
public class AllBean {
private final Map<String, MyBean> beanMap;
private final List<MyBean> beanList;
@Autowired
public AllBean(Map<String, MyBean> beanMap, List<MyBean> beanList) {
this.beanMap = beanMap;
this.beanList = beanList;
}
public void whatBean(String bean){
MyBean myBean = beanMap.get(bean);
System.out.println("myBean.getClass() = " + myBean.getClass());
}
}
테스트 코드 작성
AnnotationConfigApplicationContext으로 스프링 컨테이너 접근@ComponentScan 붙은 설정 정보 클래스 @Test
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
void AllBeanTest(){
AllBean bean = ac.getBean(AllBean.class);
bean.whatBean("greenMyBean");
bean.whatBean("redMyBean");
}
실행결과
myBean.getClass() = class test.core.bean.GreenMyBean
myBean.getClass() = class test.core.bean.RedMyBean
출처
인프런 '스프링 핵심 원리 - 기본편' 강의