BeanFactory : 스프링 컨테이너의 최상위 인터페이스. GetBean()등의 기능들을 제공. 이 자체로 스프링 컨테이너라고도 함.
ApplicationContext: BeanFactory뿐만 아니라 MessageSource, EnviromentCapable 인터페이스 등 또한 상속받아 다양한 기능을 제공하는 스프링 컨테이너이다.
객체 호출 시 마다 객체가 새로 생성되어 메모리를 낭비하는 것을 막기 위해 고안된 디자인 패턴.
클래스마다 인스턴스가 딱 1개만 생성되도록 보장한다.
간단한 구현 방법:
1. 싱글톤으로 만들 클래스의 객체 하나를 static으로 미리 생성해놓는다.
2. 외부에서 이 클래스의 객체를 new로 새로 생성하는것을 막기위해 이 클래스의 생성자를 private으로 한다.
3. 1에서 미리 생성해놓은 객체를 리턴하는 public 메소드(getInstance() 등)를 만들어 외부에서 미리 만든 객체만을 사용하도록 한다.
위와 같은 방법은 클라이언트가 구체 클래스에 의존하게 되므로 DIP 를 어긴다. 이 외에도 싱글톤 패턴이 가진 단점은 여러가지 있다.
앞서 말한 싱글톤 패턴의 단점들은 스프링에서 제공하는 스프링 컨테이너를 가지고 개발하면 전부 해결이 된다.
스프링은 구체클래스를 스프링 컨테이너(ex.ApplicationContext )에 bean으로 등록해서 해당 구체클래스의 인스턴스를 조회할때마다 같은 객체를 반환해준다.