본문 바로가기
Spring

[Spring] FactoryBean & ApplicationContextAware 인터페이스

by hxxyeoniii 2024. 5. 14.

스프링의 빈 등록

스프링은 지정된 클래스 이름을 가지고 리플렉션을 이용해 빈을 생성한다.

하지만, 스프링에서 DI 할 수 없는 클래스의 빈이 있을 수도 있음 -> 정보를 미리 알아낼 수 없는 경우

 

- Dynamic Proxy로 만드는 객체의 경우, 클래스를 미리 알 수 없음

- new 연산자로 생성할 수 없는 객체

- Third-Party에서 제공하는 클래스 등

 

-> 이를 위해 스프링에서 FactoryBean 클래스 제공


 

FactoryBean

FactoryBean 인터페이스

public interface FactoryBean {
    T getObject() throws Exception;
    Class<?> getObjectType();
    boolean isSingleton();
}

- getObject() : 팩토리에 의해 만들어진 객체 반환 -> 반환되는 객체는 빈으로 등록되며 싱글톤으로 관리된다.

- getObjectType() : FactoryBean이 만든 객체 타입 반환

- isSingleTon() : FactoryBean이 싱글톤 여부 반환

 

 

 

ApplicationContextAware

ApplicationContextAware 인터페이스

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    this.applicationContext = applicationContext;
}

- 빈이 ApplicationContextAware 인터페이스를 구현하면, 빈 생성 및 의존성 주입 완료 후에 setApplicationContext()를 호출한다. 이를 통해 빈은 자신의 인스턴스를 생성 및 관리하는 ApplicationContext가 어떤 인스턴스인지 확인하고 접근할 수 있다.

- 즉, 빈을 관리하는 ApplicationContext 인스턴스에 직접 접근이 필요한 경우 사용하는 인터페이스이다.

 

 


BeanExample 클래스를 빈으로 등록해보자

BeanExample.java : FactoryBean, ApplicationContextAware 구현

package smartsuite.app.bp.edoc;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class BeanExample implements FactoryBean<BeanExample>, ApplicationContextAware {
   private final static Logger LOG = LoggerFactory.getLogger(BeanExample.class);
   private ApplicationContext applicationContext;

   @Override
   public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
      this.applicationContext = applicationContext;
   }

   @Override
   public BeanExample getObject() throws Exception {
      return (BeanExample) applicationContext.getBean(BeanExample.class);
   }

   @Override
   public Class<BeanExample> getObjectType() {
      return BeanExample.class;
   }

   @Override
   public boolean isSingleton() {
      return true;
   }
}

 

 

context에 빈 등록