Bean

Programming/Spring Framework 2017. 12. 1. 23:20

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
손가락귀신
정신 못차리면, 벌 받는다.

,