ApplicationContext applicationContext = new AnnotationConfigApplicationContext();
여기서 ApplicationContext가 곧 스프링 컨테이너입니다
//김영한님의 스프링 핵심원리 기본편 강의의 코드를 참조했습니다
public class SomeService {
public static final SomeService instance = new SomeService();
public static SomeService getInstance() {
return instance;
}
private SomeService() {}
}
위 코드를 하나하나 뜯어서 살펴보겠습니다
public static final SomeService instance = new SomeService();
public static SomeService getInstance()
private SomeService()
따라서 싱글톤 패턴은 전반적으로 유연성이 굉장히 떨어지게 됩니다
스프링이 DI, IoC를 통해 OOP 원칙을 지킬 수 있도록 했던 것처럼, 여기서도 Spring 컨테이너는 싱글톤 컨테이너의 기능을 수행하여 싱글톤의 단점들을 커버합니다
단, 무상태(stateless)로 설계해야 합니다! 이를 위해서는 다음을 준수해야 합니다
- 특정 클라이언트에 의존적인 필드가 있으면 안된다
- 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안된다
- 가급적 읽기만 가능해야 한다
- 필드 대신에 자바에서 공유되지 않는, 지역변수, 파라미터, ThreadLocal 등을 사용해야 한다
AppConfig.class에 반드시 붙어야 하는 어노테이션인 @Configuration은 바이트코드를 조작하여 싱글톤을 가능하게 만듭니다.
AppConfig 내부에서 같은 클래스의 인스턴스를 여러 번 초기화 하는 경우가 발생한다면, 스프링 빈에 존재하는 빈으로 모두 통일하여 인스턴스를 반환합니다
자세한 사항은 김영한님의 인프런 강의 - 스프링의 핵심 원리를 참고해주세요!