스프링/1. 스프링 핵심 원리

26강. BeanDefinition

sdafdq 2023. 7. 18. 21:34

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 이거 자기가 직접 정의할 수 있음