BeanDefinition 저거 인터페이스임.
그래서 여러 곳에서 저렇게 불러들일 수 있는거
@Bean 하나당 메타정보 하나
우리가 AppConfig 저거 쓴거가지고 저걸 만듦
public class BeanDefinitionTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
@Test
@DisplayName("BeanDefinition 출력")
public void findApplicationBean(){
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION){
System.out.println("beanDefinition = " + beanDefinition);
}
}
}
}
인터페이스 안쓰고 AnnotationConfigApplicationContext 이걸로 쓴 이유는 인터페이스로는 getBeanDefinition이게 정의가 안되어 있나봄.
ac.getBeanDefinitionNames(); 이름들 다 불러오고
BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
그 후 걍 그대로 출력해보면
beanDefinition = Generic bean: class [co m.example.core.AppConfig$$SpringCGLIB$$0]; scope=singleton; abstract=false; lazyInit=null; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodNames=null; destroyMethodNames=null
beanDefinition = Root bean: class [null]; scope=; abstract=false; lazyInit=null; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=appConfig; factoryMethodName=memberService; initMethodNames=null; destroyMethodNames=[(inferred)]; defined in com.example.core.AppConfig
beanDefinition = Root bean: class [null]; scope=; abstract=false; lazyInit=null; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=appConfig; factoryMethodName=memberRepository; initMethodNames=null; destroyMethodNames=[(inferred)]; defined in com.example.core.AppConfig
beanDefinition = Root bean: class [null]; scope=; abstract=false; lazyInit=null; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=appConfig; factoryMethodName=orderService; initMethodNames=null; destroyMethodNames=[(inferred)]; defined in com.example.core.AppConfig
beanDefinition = Root bean: class [null]; scope=; abstract=false; lazyInit=null; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=appConfig; factoryMethodName=discountPolicy; initMethodNames=null; destroyMethodNames=[(inferred)]; defined in com.example.core.AppConfig
scope=;
할당 안되어 있는건 싱글톤이라는 거
lazyInit=null;
보통 빈은 컨테이너 뜨면 다 생성하는데,
뭔가 값이 있으면 실제 사용하기 전 까지 지연생성
BeanDefinition 이거 자기가 직접 정의할 수 있음
'스프링 > 1. 스프링 핵심 원리' 카테고리의 다른 글
28강. @Configuration가 싱글톤을 보장해주는 방식 (0) | 2023.07.20 |
---|---|
27강. 스프링 컨테이너와 싱글톤 (0) | 2023.07.18 |
25강. XML로 스프링 (0) | 2023.07.17 |
24강. 빈 컨테이너 구조 (0) | 2023.07.17 |
23강. 빈 조회 시 빈들이 상속관계에 있다면? (0) | 2023.07.17 |