# 스프링 빈 설정 메타 정보 - BeanDefinition

스프링 컨테이너는 BeanDefinition에만 의존한다!

역할과 구현을 분리하고, 역할(인터페이스)에 의존하는 것을 따른다!

![](blob:https://app.gitbook.com/48c9d3d0-a854-428c-84fc-578c5edaf7f0)

factoryBeanName=appConfig;\
factoryMethodName=memberService;

\=>appConfig에 있는 memberService를 호출해서 실제 빈을 생성할 수 있다는 의미이다!

이러한 메타정보를 기반으로 인스턴스를 생성할 수 있다!

BeanDefinition 정보

* **BeanClassName** : 생성할 빈의 클래스명(자바 설정처럼 **팩토리 역할의 빈을 사용하면 없음**)
* **factoryBeanName** : 팩토리 역할의 빈을 사용할 경우 ex)appConfig
* **factoryMethodName** : 빈을 생성할 팩토리 메서드 지정 ex)memberService(), memberRepository()..등의 메서드들을 통해 제공.\
  외부에서 메서드를 호출해서 생성되는 방식.&#x20;
* Scope : 싱글톤(기본값)
* lazyInit : 스프링 컨테이너를 생성할 때 빈을 생성하는 것이 아니라, 실제 빈을 사용할 때까지 최대한 생성을 지연처리하는지 여부
* InitMethodName : 빈을 생성하고 의존관계를 적용한 뒤에 호출되는 초기화 메서드 명
* DestroyMethodName : 빈의 생명주기가 끝나서 제거하기 직전에 호출되는 메서드 명
* Constructor argument, Propeerties : 의존관계 주입에서 사용한다.(자바 설정처럼 팩토리역할의 빈을 사용하면 없음!)

**스프링에 빈을 등록하는 방법**

1. xml처럼 **직접 스프링 빈에 등록하는 방법** // =factoryBeanName ex)appConfig
2. **factoryMethodName** : **빈을 생성할 팩토리 메서드 지정**. factory method를 이용하는 방법( AppConfig.java)\
   memberService(), memberRepository(),..등의 메서드들을 통해 제공.\
   외부에서 메서드를 호출해서 생성되는 방식.
