앞에서 AppConfig의 설정에 따라 스프링 컨테이너에 빈들을 등록했는데
과연 잘 등록되었을까?
우리가 설정한 빈들이 스프링 컨테이너에 잘 등록되었는지 확인해보기 위해
스프링 컨테이너에 있는 모든 빈들을 조회해보자.
public class ApplicationContextTest {
AnnotationConfigApplicationContext ac=
new AnnotationConfigApplicationContext(AppConfig.class);
@Test
@DisplayName("모든 빈 출력하기")
void findAllBean(){
// 스프링 컨테이너에 있는 모든 빈 출력하기
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
Object bean = ac.getBean(beanDefinitionName);
System.out.println("빈 이름 = "+beanDefinitionName+","
+ "등록된 빈 class = " + bean);
}
}
}
- getBeanDefinitionNames : 스프링에 등록된 모든 빈 이름을 조회한다
빈 이름은 우리가 AppConfig 클래스에서 설정한 메서드의 이름이 된다.
- getBean : 빈 이름으로 빈 객체를 조회한다.
위의 코드에서는 클래스 타입을 지정할 수 없기 때문에 Object 형으로 설정함.
위 코드의 실행 결과 , 빈들의 이름은 메서드의 이름과 동일하며, 우리가 @Bean으로 지정한 것들이 잘 등록되었음을 알 수 있다.
그런데 출력결과를 보면 @Bean으로 등록한 것들 뿐만 아니라 스프링에서 내부적으로 설정한 빈들도 모두 출력된다.

우리가 설정한 빈들만 출력되도록 코드를 수정해보자 .
@Test
@DisplayName("우리가 설정한 빈들만 출력하기")
void findApplicationBean(){
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("빈 이름 = "+beanDefinitionName+","
+"등록된 빈 class = " + bean);
}
}
}
- getBeanDefinition : 빈 하나하나에 대한 정보
- 스프링이 내부에서 사용하는 빈 : getRole( ) 로 구분
- ROLE_APPLICATION: 직접 등록한 애플리케이션 빈
- ROLE_INFRASTRUCTURE: 스프링이 내부에서 사용하는 빈
코드를 수정한 뒤 출력화면에는 우리가 설정한 빈들만 나오는 것을 알 수 있다.

'Spring > 김영한 스프링 핵심원리 - 기본편' 카테고리의 다른 글
[섹션4-4] 스프링 빈 조회 - 동일한 타입이 둘 이상인 경우 (2) | 2024.02.09 |
---|---|
[섹션4-3] 스프링 빈 조회- 기본 (0) | 2024.02.09 |
[섹션4-1] 스프링 컨테이너 생성하기 (2) | 2024.02.06 |
6. 스프링으로 전환하기 (0) | 2024.02.05 |
5. AppConfig 리펙터링과 정리(Ioc,DI,컨테이너) (2) | 2024.02.05 |