✔️ 순수 자바 DI 컨테이너는
객체를 생성할 때마다 새로 객체를 만든다.
✔️ 메모리 낭비가 심하다 ➡️ 싱글톤 패턴
클래스의 인스턴스가 1개만 생성되도록 순수 자바 코드를 수정
1. private static final 객체를 내부에서 미리 생성
2. get 함수를 통해서만 내부에서 미리 생성된 객체를 얻어서 외부에서 사용할 수 있음
3. 생성자 자체를 private로 선언해서 외부에서는 생성할 수 없음
✔️ 코드의 복잡성, 클라이언트가 구체 클래스 의존,DIP와 OCP 위반➡️ 스프링의 싱글톤 컨테이너
하나를 다같이 공유하여 사용 따라서 상태변수를 넣어주지 않도록 주의하자
final인 정적 변수만 넣어주기
@Configuration과 바이트 조작의 마법: @Configuration이 CGLIB 기술을 이용하여 싱글톤 보장
위 코드를 보면 분명 아래의 코드의 MemberRepository가 3번 호출되어야 한다.
그러나
위와 같이 MemberRepository는 한번만 호출되고 계속 재사용되었음을 알 수 있다.
이는 스프링이 CGIB라는 바이트 코드 조작 라이브러리를 사용하기 때문이다.
따라서 bean의 클래스를 출력하면 단순히 AppConfig가 아니라 뒤에 XXXCGLIB가 붙어 있는, AppConfig를 상속받은 클래스가 스프링 빈에 등록됨