본문 바로가기

SpringFramework Core - I. IoC 컨테이너/8. 컨테이너의 확장가능한 부분들

1.8.3. FactoryBean으로 인스턴스화 로직 커스터마이징하기

팩토리인 객체들을 위해 org.springframework.beans.factory.FactoryBean 인터페이스를 구현할 수 있다. 

 

FactoryBean 인터페이스는 스프링 IoC 컨테이너의 인스턴스화 로직에 플러그인할 수 있는 지점을 제공한다. 만약 자바로는 더 간단하게 표현할 수 있지만 장황한 XML로 쓰여진 복잡한 초기화 코드들을 가지고 있다면, FactoryBean을 생성하고 그 클래스 안에서 복잡한 초기화들을 작성하여, 컨테이너로 플러그인시키면 된다.

 

FactoryBean 인터페이스는 세 가지 메소드를 제공한다.

  • Object getObject(): 해당 팩토리가 생성하는 객체의 인스턴스를 반환한다. 인스턴스는 해당 팩토리가 싱글턴을 반환하는지 프로토타입을 반환하는지에 따라 공유될 수도 있다.
  • boolean isSingleton(): 해당 FactoryBean이 싱글턴을 반환한다면 true를 반환한다. 반대의 경우에는 false를 반환한다.
  • Class getObjectType(): getObject() 메소드에 의해 반환되는 객체 타입을 반환한다. 타입을 알 수 없다면 null을 반환한다.

FactoryBean 개념과 인터페이스는 스프링 프레임워크의 아주 많은 곳들에서 사용되고 있다. 스프링 자신을 포함하여 50개도 넘는 FactoryBean 인터페이스의 구현체들이 스프링 프레임워크에 담겨있다.

 

FactoryBean이 생산하는 bean 대신에 실제 FactoryBean 인스턴스 그 자체에 대해 컨테이너에게 요청하고 싶을 때는, ApplicationContext의 getBean() 메소드를 호출할 때 bean의 id에 ampersand symbol(&)을 서문으로 달아라. 그러면, myBean이라는 id로 제공된 FactoryBean에 대해, 컨테이너에 getBean("myBean")을 호출하면 FactoryBean의 생산한 것을 반환받을 수 있고 getBean("&myBean")을 호출하면 FactoryBean 인스턴스 자체를 반환받을 수 있다.