본문 바로가기
IT/Java

[Spring] BeanDefinition 이란?

by 성준하이 2023. 6. 29.
반응형

결론 먼저 말하면 

스프링 빈의 설정 메타 정보이고 Bean등록한 것들마다 하나씩 메타 정보가 생성이 된다.

스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성하곤 한다.

 

이전에는 xml 위주로, 그리고 어느순간부터는 자바코드로, 그리고 지금은 어노테이션 등으로 빈 설정을 지원하고,

이 지원하는게 가능한 것이 바로 BeanDefinition 이라는 추상화가 있기에 가능하다.

 

아래 그림을 먼저 보면

BeanDefinition은 interface로 생성이 되어 역할을 갖고 아래 AppConfig 들이 각각 구현이 된다.

 

그리고 좀더 자세하게는 아래 그림을 보면

위에 AppConfig 를 그냥 읽는것이 아닌 ApplicationContext 에서 가능하게 한다.

 

그럼 BeanDefinition의 메타 정보가 어떻게 되어있는지 코드로 풀어내볼 것이다.

예제코드는 다음과 같다.

class BeanDefinitionTest {

    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

    @Test
    @DisplayName("빈 설정 메타정보 확인")
    void findApplicationBean() {
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);

            if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
                System.out.println("beanDefinitionName = " + beanDefinitionName);
                System.out.println("beanDefinition = " + beanDefinition);
            }
        }
}

그리고 빈 설정 된 정보는 아래 코드에서 참고 바란다.

@Configuration
public class AppConfig {

    @Bean
    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}

 

로그 정보는 아래와 같고,

beanDefinitionName = memberService
beanDefinition = Root bean: class [null]; scope=; abstract=false; lazyInit=null; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false;
                               factoryBeanName=appConfig; factoryMethodName=memberService; initMethodName=null; destroyMethodName=(inferred); defined in hello.core.AppConfig

beanDefinitionName = memberRepository
beanDefinition = Root bean: class [null]; scope=; abstract=false; lazyInit=null; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; 
                             factoryBeanName=appConfig; factoryMethodName=memberRepository; initMethodName=null; destroyMethodName=(inferred); defined in hello.core.AppConfig

여기서는 

factoryBeanName=appConfig;   //AppConfig 명

factoryMethodName=memberService;   //Bean 명

 

두가지를 기억하면 된다

반응형

댓글