FactoryBean이란
BeanFactory내에 사용되는 객체가 구현할 인터페이스입니다.
해당 인터페이스를 구현하는 경우, bean instance 자체로 노출되어 사용되는 것이 아니라, 객체를 노출할 factory로 사용됩니다.
Interface to be implemented by objects used within a BeanFactory which are themselves factories for individual objects. If a bean implements this interface, it is used as a factory for an object to expose, not directly as a bean instance that will be exposed itself.
스프링 빈 컨테이너에는 2가지 종류에 빈이 있습니다. ordinary bean과 factory bean이 있습니다.
스프링은 ordinary bean을 직접 사용하고, factory bean은 객체 스스로 생성되어 사용됩니다. 두 bean 모두 프레임워크에 의해 관리됩니다.
There are two kinds of beans in the Spring bean container: ordinay and factory beans. Spring uses the former directly, whereas latter can produce objects themselves, which are managed by the framework.
public interface FactoryBean<T> {
String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";
@Nullable
T getObject() throws Exception;
@Nullable
Class<?> getObjectType();
default boolean isSingleton() {
return true;
}
}
- getObject() – returns an object produced by the factory, and this is the object that will be used by Spring container
- 메서드명 그래도 생성된 객체를 반환합니다. 스프링 컨테이너에서 빈으로 사용됩니다.
- getObjectType() – returns the type of object that this FactoryBean produces
- isSingleton() – denotes if the object produced by this FactoryBean is a singleton
Spring은 FactoryBean 인터페이스를 구현한 클래스가 Bean의 클래스로 지정되면 FactoryBean 클래스의 getObject() 메서드를 통해 Object를 가져오고 이를 Bean Object로 사용합니다.
예시 코드
import org.springframework.beans.factory.FactoryBean;
public class CarFactoryBean implements FactoryBean<Car> {
private String brand;
private String model;
@Override
public Car getObject() throws Exception {
return new Car(brand, model); // Car 객체를 생성 및 반환
}
@Override
public Class<?> getObjectType() {
return Car.class; // 반환하는 객체의 타입을 명시
}
@Override
public boolean isSingleton() {
return true; // true로 설정하면 스프링 컨테이너에서 싱글톤으로 관리
}
}