싱글톤 컨테이너
웹 애플리케이션과 싱글톤
싱글톤 패턴, 컨테이너
public class SingletonService {
private static final SingletonService instance = new SingletonService();
public static SingletonService getInstance() {
return instance;
}
private SingletonService() {
}
public void logic() {
System.out.println("싱글톤 객체 로직 호출");
}
}
getInstance()
메서드를 통해서만 조회할 수 있다. 이 메서드를 호출하면 항상 같은 인스턴스를 반환한다.이러한 문제점을 스프링은 어떻게 보완하였을까?
싱글톤 방식의 주의점
@Test
void statefulServiceSingleton() {
ApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class);
StatefulService statefulService1 = ac.getBean(StatefulService.class);
StatefulService statefulService2 = ac.getBean(StatefulService.class);
//ThreadA: A사용자 10000원 주문
int userAPrice = statefulService1.order("userA", 10000);
//ThreadB: B사용자 20000원 주문
int userBPrice = statefulService2.order("userB", 20000);
//ThreadA: 사용자 A 주문 금액 조회
System.out.println("price = " + userAPrice);
// Assertions.assertThat(statefulService1.getPrice()).isEqualTo(20000);
}
StatefulService
의 price
필드는 공유되는 필드인데, 특정 클라이언트가 값을 변경한다@Configuration과 싱글톤, 바이트코드 조작의 마법
@Configuration
을 사용하자.