스프링 컨테이너에 등록 된 빈을 조회는 방법에 대해 알아보겠습니다.
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 타입에 의존하면 추후에 변경 할 때 해당 인스턴스에 의존성이 강해서 문제가 생길 수 있습니다.