본문 바로가기

SpringFramework Core - I. IoC 컨테이너/3. Bean 개관

3.2. Bean 인스턴스화 하기

원문: https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-factory-class

 

 

'bean 정의'는 본질적으로 하나 이상의 객체들을 만들어내기 위한 레시피이다. 컨테이너는 요청을 받으면 이름이 붙여진 bean의 레시피를 찾아보고, 실제 객체를 만들어내기 위해 bean의 정의에 캡슐화되어 있는 설정 메타데이터를 사용한다.

 

만약 XML 기반의 설정 메타데이터를 사용한다면, <bean/> 요소의 class 속성에 인스턴스화되어야할 타입(또는 클래스)을 특정할 것이다. 이 class 속성은 보통 의무다. (예외로, '인스턴스 팩토리 메서드'와 'Bean 정의 상속'을 사용하여 인스턴스화하기가 있다). Class 프로퍼티는 다음 두 가지 방법 중 하나로 사용될 수 있다.

  • 자바의 new 연산자처럼 컨테이너가 bean의 생성자를 호출해 bean을 직접 생성하는 방식인 곳에서, bean 클래스를 특정하려고 할 때
  • 컨테이너가 bean을 만들기 위해 static한 팩토리 메서드를 호출하는 경우에(흔치 않음), static 팩토리 메서드를 포함하는 실제 클래스를 특정하려고 할 때. static 팩토리 메서드의 호출로부터 반환받는 객체의 타입은 같은 클래스일수도 있고 아예 다른 클래스일수도 있다.

 

 내부 클래스의 이름
만약 static한 내부 클래스에 대한 bean 정의를 설정하고 싶다면, 반드시 내부 클래스의 binary한 이름을 사용해야 한다.

예를 들어 com.example 패키지에 SomeThing이라는 클래스를 가지고 있을 때, 그리고 이 SomeThing이라는 클래스가 OtherThing이라는 static한 내부 클래스를 가지고 있을 때, bean 정의에서의 class 속성값은 'com.example.SomeThing$OtherThing'일 것이다. 

'$'라는 기호를 이름에 사용하면 외부 클래스의 이름과 내부 클래스의 이름을 구분할 수 있다는 점을 기억하라.