반응형

3.2.1 BeanFactory

빈 팩토리는 여러 개의 빈 객체를 생성하고, 이를 구성하고, 관리하는 컨테이너이다. 

 

빈들끼리는 서로 협력하고 서로 간의 의존성을 가진다. 이 의존성들은 빈 팩토리의 구성 데이터에 반영이 된다. (어떠한 의존성들은 보이지 구성 데이터에 보이지 않지만, 런타임 때 함수로서 작동이 된다.)

 

빈 팩토리는 org.springframework.beans.factory.BeanFactory 라는 인터페이스에 나타나며 이곳에는 여러가지 구현이 되어 있다. ApplicationContext도 빈 팩토리의 하위 클래스이나, 가장 많이 사용되는 구현은 org.springframework.beans.factory.xml.XmlBeanFactory이다. 이처럼 빈 팩토리에 의해 관리되는 구현을 사용할 때에도 빈 팩토리에 대해 알 필요는 없다. 빈 팩토리가 어떤 방식으로든 객체화 되어 있기 때문이다.

 

많은 경우, 빈 팩토리와 Application Context 객체를 생성할 필요가 없다. 스프링 프레임워크에서 해주기 때문이다. 처음에 dependencies 설정할 때 wep-app 부분에 포함되어 있는 듯 하다.

 

 

 

 

빈 팩토리의 구성은 빈 팩토리가 관리해야 하는 빈의 정의로 이루어져 있다. XmlBeanFactory의 경우, 상위 빈 요소 안의 빈들로 구성되어 있다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
  
  <bean id="..." class="...">
    ...
  </bean>
  <bean id="..." class="...">
    ...
  </bean>

  ...

</beans>

XmlBeanFactory

 

 

 

 

 

3.2.2 빈 정의

빈 정의는 다음의 세부사항을 포함한다.

 

1)  클래스 이름

2) 빈이 컨테이너에서 어떻게 동작해야 하는지를 나타내는 빈 동작 구성 요소

3) 새로 생성된 빈에 설정할 생성자 인수 및 속성 값

4) 빈이 작업을 수행하는 데 필요한 다른 빈 즉, 협력자

 

이 개념들은 빈 정의가 구성하는 요소 집합으로 직접 변환된다.

 

1) 클래스

2) 아이디, 이름

3) 싱글톤, 또는 프로토타입

4) 생성자 인수

5) 빈 속성

6) AutoWiring 모드

7) 의존성 검사 모드

8) 초기화 방법

9) 파기 방법

 

빈 정의는 실제 인터페이스 org.springframework.beans.factory.config.BeanDefinition 에 구현이 되어 있다는 점을 참고하자.

빈 팩토리 외에서 커스텀하게 만들어진 빈을 등록하는 것도 허용한다. DefaultListableBeanFactory는 registerSingleton method를 통해 이 등록과정을 지원한다.

 

 

 

 

 

 

3.2.3 빈 클래스

클래스 속성은 일반적으로 필수적이다. 그리고 두 가지 중 하나의 목적으로 사용된다. 빈 팩토리가 생성자를 호출하여 스스로 빈을 만들어내는 경우(자바에서 new 연산자와 동일하다), 클래스 속성은 생성할 빈을 지정한다. 빈 팩토리가 static factory 방법을 사용하는 드문 상황에서는 클래스 속성이 실제 static factory를 포함하는 클래스를 지정한다.

 

3.2.3.1 생성자를 통한 빈 생성

생성자를 통해 빈을 생성한 경우, 스프링이 모든 일반적인 클래스를 사용할 수 있고 호환이 가능하다. 즉, 이렇게 만들어진 클래스는 인터페이스를 직접 구현하거나 특정 방식으로 코딩할 필요가 없다. 다만, 어떤 IoC 컨테이너를 사용하느냐에 따라 빈 생성자를 추가해줘야 할 때도 있다.

 

게다가, 빈 팩토리는 자바 빈 말고도 다른 어떤 클래스도 관리할 수 있다. 대부분의 사람들이 자바 빈을 빈 팩토리에 등록하여 사용하는 것을 선호하지만, 빈이 아닌 클래스도 스프링이 관리하여 사용할 수 있다.

 

 

 

3.2.3.2 static factory를 이용한 빈 생성

static factory나 static factory 방법을 포함하는 클래스를 지정하는 클래스 속성을 사용할 때에, 또 다른 속성인 factory-method에는 factory 자기자신의 이름을 명시에 주어야 한다. 스프링이 이 이름을 부르고, 다시 생성자를 통해 만든 객체 상태로 되돌리기를 기대하기 때문이다. 빈 정의를 사용하는 이유 중 하나가 정적 팩토리를 부르기 위해서이다. 밑에 코드에서 createInstance는 static 이어야 한다.

 

<bean id="exampleBean"
      class="examples.ExampleBean2"
      factory-method="createInstance"/>

 

 

 

 

 

3.2.3.3 instance factory를 이용한 빈 생성

이것은 위의 static factory를 이용한 빈 생성과 유사하지만, instance는 non-static이라는 점에서 차이가 있다. 여기에서 기존 빈의 팩토리 메소드를 호출하여 새로운 빈을 생성한다. 이 메커니즘을 사용하려면 클래스 속성을 비워두어야 하며, factory-bean 속성은 팩토리 메소드를 포함하는 조상빈의 이름으로 해야 한다.

 

<!-- The factory bean, which contains a method called
     createInstance -->
<bean id="myFactoryBean"
      class="...">
  ...
</bean>
<!-- The bean to be created via the factory bean -->
<bean id="exampleBean"
      factory-bean="myFactoryBean"
      factory-method="createInstance"/>

 

 

 

 

 

 

3.2.4 빈 식별자

모든 빈은 한 개나 두 개의 id를 가지고 있다. 대부분 한 개를 가지고 있지만, 두 개라면 이는 본질적으로 별칭으로 고려된다. id 속성을 사용하면 하나의 id를 입력할 수 있다. 만약 id가 XML에서 유효하지 않거나, 두 개의 id를 작성하고 싶다면 콜론이나 세미콜론으로 구분하거나 이름 속성에 작성하면 된다.

 

 

 

3.2.5 싱글톤으로, 혹은 비 싱글통

빈은 싱글톤이거나 비 싱글통 중 하나의 모드로 결정이 된다. 빈이 싱글톤인 경우, 하나의 공유 인스턴스만이 빈에 의해 관리된다

반응형

+ Recent posts