본문 바로가기

java

Spring 기본 Bean조회하는 법 빈 조회 정리

스프링 컨테이너에 등록 된 빈을 조회는 방법에 대해 알아보겠습니다.

 AnnotationConfigApplicationContext ac = new
AnnotationConfigApplicationContext(AppConfig.class) //Appconfig.class어노테이션 기반 config클래스

위와 같이 스프링 컨테이너 객체를 생성해 줍니다. 

1.모든 빈 조회 

string[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
 Object bean = ac.getBean(beanDefinitionName);
 }

위와 같이 getBeanDefinitionNames(); 를 사용하면 배열형태로 컨테이너에 등록된 모든 빈값이 반환 됩니다.

그 후 반환된 값을 getBean()을 사용해서 이름을 통해 조회 하면 됩니다.

2.어플리케이션 빈 출력

String[] beanDefinitionNames = ac.getBeanDefinitionNames();

 for (String beanDefinitionName : beanDefinitionNames) {
 BeanDefinition beanDefinition =ac.getBeanDefinition(beanDefinitionName);
 
 if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
     Object bean = ac.getBean(beanDefinitionName);
     System.out.println("name=" + beanDefinitionName + " object=" + bean);
  	}  
 }

위와 똑같이getBeanDefinitionNames()을 사용해서 모든 빈을 반환 하고 getBean()을 활용해 빈의 이름으로 빈의 정보를 추출 한다.

이때 빈의 Role()이 ROLE_APPLICATION이면 내가 직접 등록한 빈, ROLE_INFRASTRUCTURE이면 스프링 내부에서 사용하는 빈을 조회하게 됩니다.

3. 타입으로 조회

ac.getBean(타입);

@Test
 @DisplayName("빈 타입으로 조회")
 void findBeanByType() {
 MemberService memberService = ac.getBean(MemberService.class);
 assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
 }

4.빈이름으로 조회

ac.getBean(빈이름,타입)

@Test
 @DisplayName("빈 이름으로 조회")
 void findBeanByName() {
 MemberService memberService = ac.getBean("memberService",
MemberService.class);
 assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
 }

5.인터페이스의 구현체로 조회

@Test
 @DisplayName("구현체 타입으로 조회")
 void findBeanByName2() {
 MemberServiceImpl memberService = ac.getBean("memberService",MemberServiceImpl.class);
 assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
 }
 
 
 
 //appconfig
 @Configuration
public class AppConfig {
 @Bean
 public MemberService memberService() {
 	return new MemberServiceImpl(memberRepository());
 	}
 }

위와 같이 반환 타입인MemberService가 아닌  반환 인스턴스 memberServiceImpl타입을 직접적으로 타입으로 선택해서 조회 할 수 있다. return 타입에 의존하면 추후에 변경 할 때 해당 인스턴스에 의존성이 강해서 문제가 생길 수 있습니다.