JUST WRITE

BeanFactory vs ApplicationContext 본문

Programing/Spring

BeanFactory vs ApplicationContext

천재보단범재 2021. 12. 21. 19:04
이 글은 Baeldung 사이트 'Difference Between BeanFactory and ApplicationContext'를 해석, 정리한 글입니다.

 

BeanFactory vs ApplicationContext

BeanFactory vs ApplicationContext

Spring Framework는 BeanFactory, ApplicationContext 2개의 IoC Container를 가지고 있다.

BeanFactory가장 기본적인 IoC Container이다.

ApplicatonContextBeanFactory를 확장한 IoC Container이다.

Bean Loading

BeanFactory요청 시 Bean을 load 하고 ApplicationContext시작 시 모든 Bean을 load한다.

BeanFactory는 상대적으로 가볍고 Memory가 제한된 시스템에서 유용하다.

예를 들어 Singleton Bean Class를 하나 만든다.

public class Student {
    public static boolean isBeanInstantiated = false;

    public void postConstruct() {
        setBeanInstantiated(true);
    }

    //standard setters and getters
}
<bean id="student" class="com.baeldung.ioccontainer.bean.Student" init-method="postConstruct"/>

BeanFactory에서는 getBean Method를 해야 load 된다.

@Test
public void whenBFInitialized_thenStudentInitialized() {
    Resource res = new ClassPathResource("ioc-container-difference-example.xml");
    BeanFactory factory = new XmlBeanFactory(res);
    // getBean Method로 Bean load
    Student student = (Student) factory.getBean("student");
}

ApplicationContext는 시작 시 바로 Bean을 load 한다.

@Test
public void whenAppContInitialized_thenStudentInitialized() {
    ApplicationContext context = new ClassPathXmlApplicationContext("ioc-container-difference-example.xml");
}

Enterprise Application

ApplicationContext는 BeanFactory보다 좀 더 Framework 스럽고 Enterprise Application에 적합하다.

Enterprise Application에 적합한 이유는 아래와 같은 특징을 가지고 있다.

  • Messaging
  • Event Publication
  • Annotation 기반 DI
  • Spring AOP 지원

추가적으로 ApplicationContext모든 Bean Scope를 지원한다.

반면에 BeanFactorySingleton, Prototype 두 가지 Bean Scope를 지원한다.

BeanFactoryPostProcessor / BeanPostProcessor 자동 등록

ApplicationContextBeanFactoryPostProcessorBeanPostProcessor를 자동으로 등록한다.

반면에 BeanFactory는 그렇지 않다.

예를 들어 BeanFactoryPostProcessor와 BeanPostProcessor를 구현한 Class를 만든다.

public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    private static boolean isBeanFactoryPostProcessorRegistered = false;
    
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory){
        setBeanFactoryPostProcessorRegistered(true);
    }

    // standard setters and getters
}

public class CustomBeanPostProcessor implements BeanPostProcessor {
    private static boolean isBeanPostProcessorRegistered = false;
    
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName){
        setBeanPostProcessorRegistered(true);
        return bean;
    }

    //standard setters and getters
}
<bean id="customBeanPostProcessor" 
  class="com.baeldung.ioccontainer.bean.CustomBeanPostProcessor" />
<bean id="customBeanFactoryPostProcessor" 
  class="com.baeldung.ioccontainer.bean.CustomBeanFactoryPostProcessor" />
@Test
public void whenBFPostProcessorAndBPProcessorRegisteredManually_thenReturnTrue() {
    Resource res = new ClassPathResource("ioc-container-difference-example.xml");
    ConfigurableListableBeanFactory factory = new XmlBeanFactory(res);
	
    // BeanFactory는 직접 생성, Register
    CustomBeanFactoryPostProcessor beanFactoryPostProcessor 
      = new CustomBeanFactoryPostProcessor();
    beanFactoryPostProcessor.postProcessBeanFactory(factory);
    assertTrue(CustomBeanFactoryPostProcessor.isBeanFactoryPostProcessorRegistered());

    CustomBeanPostProcessor beanPostProcessor = new CustomBeanPostProcessor();
    factory.addBeanPostProcessor(beanPostProcessor);
    Student student = (Student) factory.getBean("student");
    assertTrue(CustomBeanPostProcessor.isBeanPostProcessorRegistered());
}

@Test
public void whenAppContInitialized_thenBFPostProcessorAndBPostProcessorRegisteredAutomatically() {
    ApplicationContext context 
      = new ClassPathXmlApplicationContext("ioc-container-difference-example.xml");

    assertTrue(CustomBeanFactoryPostProcessor.isBeanFactoryPostProcessorRegistered());
    assertTrue(CustomBeanPostProcessor.isBeanPostProcessorRegistered());
}

Spring 2.0 이상부터는 BeanPostProcessor를 잘 사용하므로 ApplicationContext 사용을 권고합니다.

BeanFactory를 쓰면 AOP를 사용 시 추가적인 코드 작성이 필요하다.

 

BeanFactory는 기본적인 특성만 가지고 있고, ApplicationContext는 Enterprise Application에 적합하다.

일반적으로 ApplicationContext를 추천한다.

만약 Memory를 신경 써야 할 때 BeanFactory를 사용한다.

728x90
반응형

'Programing > Spring' 카테고리의 다른 글

HTTP/2.0 적용  (0) 2022.01.11
@ControllerAdvice Exception 처리  (0) 2022.01.03
Bean Annotations  (0) 2021.12.20
@Autowired  (0) 2021.10.22
DispatcherSerlvet  (0) 2021.10.15
Comments