Spring BeanDefinition

강정우·2023년 11월 1일
0

Spring-boot

목록 보기
9/73
post-thumbnail

BeanDefinition

  • BeanDefinition 이라는 개념은 Bean을 정의한 것.
    즉, 우리가 앞서 grooby, java, xml로 SpringContainer를 만들 수 있었는데 이는 BeanDefinition이라는 추상화가 있기에 가능했던 것이다.

  • 그래서 우리는 BeanDefinition을 빈 설정 메타 정보라고 한다.
    이말은 @Bean 혹은 <bean>에 각각 하나씩 메타 정보가 생성된다는 것이다.

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

BeanDefinition 동작개념

  • AnnotationConfigApplicationContextAnnotatedBeanDefinitionReader를 사용해서 AppConfig.class를 읽고 BeanDefinition을 생성한다.

  • GenericXmlApplicationContextXmlBeanDefinitionReader를 사용해서 appConfig.xml 설정 정보를 읽고 BeanDefinition을 생성한다.

  • 새로운 형식의 설정 정보가 추가되면, XxxBeanDefinitionReader를 만들어서 BeanDefinition을 생성하면 된다.

이는 BeanDefinition을 직접 생성해서 스프링 컨테이너에 등록할 수 있다. => 실무에서 거의 X
스프링이 다양한 형태의 설정 정보를 BeanDefinition으로 추상화 해서 사용하는것으로 이해하면 된다.

  • 참고로 위와같이 작성하면 로그에 factory method라는게 보이는데 이게 바로 java를 시용해서 값을 집어넣는 AppConfig 부분에 들어가는 개념이다.
    외부(spring의 팩토리 메서드 인터페이스같은게)에서 AppConfig의 메서드들을 호출해서 생성되는 방식이다.

BeanDefinition 예시

주요 BeanDefinition 속성

  • beanClassName: 생성할 bean의 클래스 이름.
  • scope: bean의 범위를 지정. (singleton, prototype 등)
  • lazyInit: 지연 초기화 여부를 설정.
  • autowireMode: 의존성 주입 방법을 설정.
  • propertyValues: bean에 설정할 속성 값 목록.
  • initMethodName: 초기화 메서드 이름.
  • destroyMethodName: 소멸 메서드 이름.
public class BeanDefinitionExample {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();

        // BeanDefinition 생성
        BeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(MyBean.class)
                .setScope(BeanDefinition.SCOPE_SINGLETON)  // 범위 설정 (singleton)
                .setLazyInit(true)                         // 지연 초기화 설정
                .addPropertyValue("name", "Spring Bean")   // 프로퍼티 값 설정
                .setInitMethodName("init")                 // 초기화 메서드 설정
                .setDestroyMethodName("destroy")           // 소멸 메서드 설정
                .getBeanDefinition();

        // BeanDefinition 등록
        context.registerBeanDefinition("myBean", beanDefinition);

        // 컨텍스트 초기화
        context.refresh();

        // Bean 사용
        MyBean myBean = context.getBean("myBean", MyBean.class);
        System.out.println(myBean.getName());

        // 컨텍스트 종료
        context.close();
    }

    public static class MyBean {
        private String name;

        public void setName(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        // 초기화 메서드
        public void init() {
            System.out.println("Bean is being initialized");
        }

        // 소멸 메서드
        public void destroy() {
            System.out.println("Bean is being destroyed");
        }
    }
}

주요 속성 설명

  • Scope: setScope(BeanDefinition.SCOPE_SINGLETON)은 이 bean을 singleton으로 설정하는 예시.
  • LazyInit: setLazyInit(true)을 설정하면 실제 사용 시점까지 bean의 초기화를 지연할 수 있다.
  • PropertyValues: addPropertyValue("name", "Spring Bean")으로 bean의 속성을 설정할 수 있음.
  • InitMethodName: setInitMethodName("init")을 통해 초기화 메서드를 지정할 수 있음.
  • DestroyMethodName: setDestroyMethodName("destroy")로 소멸 메서드를 지정.
profile
智(지)! 德(덕)! 體(체)!

0개의 댓글