Spring Framework의 핵심은 IoC Container이고 IoC Container는 Application Context로 칭할 수 있습니다. Spring Framework 자체인 Application Context는 org.springframework.context.ApplicationContextAware 인터페이스를 Bean이 구현함으로써 가져올 수 있습니다. 


Spring Boot Application을 작성할 때 Autowire를 할 수 없는 상황에서 Bean을 호출해야 하는 경우 난감한 상태가 됩니다. 이를 위해서 Application Context를 Singleton Pattern을 적용하면 어느 위치에서든지 Application Context를 접근할 수 있다는 장점이 있습니다.

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * Application Context의 Singleton.
 */
@Component
public class ApplicationContextHolder implements ApplicationContextAware {

    public static ApplicationContext applicationCont;

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

    public static ApplicationContext get() {
        return applicationCont;
    }

}

IoC Container는 ApplicationContextHolder를 생성하게 되며, 이때 Application Context를 넘겨줍니다. 그러면 이 Application Context를 static으로 선언한 곳에 할당합니다. 이제 어느 위치에서든 다음과 같이 호출할 수 있습니다.

ApplicationContext context = ApplicationContextHolder.get();
UserRepository repository = context.getBean(UserRepository.class);