Spring IoC 컨테이너가 관리하는 모든 객체를 bean 이라고 한다. XML 메타데이터에 <bean /> 요소를 사용하거나, @Bean 어노테이션을 사용하여 bean 을 정의할 수 있다. bean 정의에는 패키지를 포함한 클래스 이름, scope, 라이프사이클 콜백, 다른 bean 의 참조(의존성), 해당 bean 의 추가 설정 등이 포함되어야 한다. 이 메타데이터들은 실제로 컨테이너 내부에서 BeanDefinition 객체를 통해 bean 으로 정의된다.
bean 의 속성
id / name 속성
컨테이너 내의 bean 은 중복된 이름을 가질 수 없으며, 유일해야 한다. <bean /> 요소의 id 나 name 속성을 사용하여 bean 의 식별자를 지정할 수 있으며, 주로 camel-case ('myBean', 'fooService' 등) 방식을 사용한다. bean 의 이름은 다른 bean 으로부터 의존성을 가지는 경우에 필요한 것이므로, 의존성을 가지지 않은 bean 은 이름을 지정하지 않아도 된다. 이 경우 컨테이너가 내부적으로 알아서 식별자를 생성할 것이다. 별칭을 사용하고 싶다면 <alias /> 요소를 사용하거나, name 속성에 쉼표 (,), 세미콜론 (;), 공백 등으로 구분하여 나열할 수 있다. @Bean 어노테이션의 name 속성을 사용하여 별칭을 제공할 수도 있다.
class / factory-bean / factory-method 속성
XML 메타데이터에서 <bean /> 요소의 class 속성에 인스턴스화 할 객체를 패키지를 포함한 타입(또는 클래스) 으로 지정한다. 컨테이너는 class 속성으로 해당 bean 의 생성자를 호출하여 bean 을 인스턴스화 하며, 클래스 내부의 static 클래스를 정의할 수도 있다 (예: com.example.Foo$Bar). 또한 factory-method 속성으로 해당 bean 의 static 팩토리 메소드를 호출하여 bean 을 인스턴스화 할 수도 있다. 이 때 static 팩토리 메소드는 객체를 반환할 수 있어야 한다.
<bean id="clientService" class="examples.ClientService" factory-method="createInstance"/> | cs |
public class ClientService { private static ClientService clientService = new ClientService(); private ClientService() {} public static ClientService createInstance() { return clientService; } } | cs |
class 속성 대신 factory-bean 과 factory-method 사용으로 기존 bean 의 non-static 메소드를 호출하여 새 bean 을 인스턴스화 할 수 있다. factory-bean 을 통해 반환되는 객체로부터 여러 개의 bean 을 생성하는 것이 가능하다.
<bean id="serviceLocator" class="examples.DefaultServiceLocator"> ... </bean> <!-- factory bean 으로 생성된 bean --> <bean id="clientService" factory-bean="serviceLocator" factory-method="createClientServiceInstance"/> | cs |
public class DefaultServiceLocator { private static ClientService clientService = new ClientServiceImpl(); private DefaultServiceLocator() {} public ClientService createClientServiceInstance() { return clientService; } } | cs |
WRITTEN BY
- 손가락귀신
정신 못차리면, 벌 받는다.