728x90
반응형
스프링 컨테이너는 빈 객체를 한 개만 생성합니다.
과연 그런지 한번 코드를 통해 알아볼까요?
public class Main {
public static void main(String[] args) {
//1. 컨테이너 초기화
AbstractApplicationContext ctx = new AnnotationConfigApplicationContext(AppCtx3.class);
//2. 빈 객체 로드 후, 사용하기
Client client = ctx.getBean(Client.class);
Client client2 = ctx.getBean(Client.class);
System.out.println("두 개의 객체가 같을까 ? : " + (client == client2));
client.send();
//3. 컨테이너 종료
ctx.close();
}
}
코드와 실행결과를 통해 두 객체가 같은 것을 확인하였습니다.
이렇게 한 식별자에 대해 한 개의 객체만 존재하는 빈은 싱글톤(Singleton) 범위 (scope)를 갖습니다.
하지만 프로토타입 범위의 빈을 설정할 수 있습니다. (사용빈도가 낮긴 하지만..)
빈의 범위를 프로토타입으로 지정하면 빈 객체를 구할 때마다 매번 새로운 객체를 생성합니다.
스프링 설정 코드를 살펴보겠습니다.
@Bean
@Scope("prototype")
public Client client() throws Exception {
Client client = new Client();
client.setHost("host");
return client;
}
@Bean 어노테이션 밑에 @Scope 어노테이션이 추가되었습니다.
Main 메서드에서 한번 실행해 볼까요?
결과는 다르다고 나왔습니다.
이처럼 특정 빈을 프로토타입 범위로 지정하려면 설정 클래스에서 prototpye을 갖는 @Scope 어노테이션을 @Bean어노테이션과 함께 사용하면 됩니다.
싱글톤 범위를 명시적으로 지정하고 시다면 @Scope("singleton") 코드를 주면 됩니다.
프로토타입의 주의점
프로토타입 범위를 갖는 빈은 완전한 라이프사이클을 따르지 않는다는 점에서 주의해야 합니다. 스프링 컨테이너는 프로토타입의 빈 객체를 생성하고 프로퍼티를 설정하고 초기화 작업까지는 수행하지만, 컨테이너를 종료한다고 해서 생성한 프로토타입 빈 객체의 소멸메서드를 실행하지 않습니다.
따라서 프로토타입 범위의 빈을 사용할 때에는 빈 객체의 소멸 처리를 코드에 직접 해야 합니다.
728x90
반응형
'Spring' 카테고리의 다른 글
[Spring] Spring AOP (0) | 2024.01.31 |
---|---|
[Spring] AOP 프로그래밍 - 프록시(Proxy) 객체 (0) | 2024.01.30 |
[Spring] 빈 라이프 사이클 - 빈 객체의 초기화와 소멸 : 커스텀 메소드 (0) | 2024.01.29 |
[Spring] 빈 라이프 사이클 : Bean 초기화, 소멸 (인터페이스) (1) | 2024.01.25 |
[Spring] AOP 프로그래밍이란 ? (1) | 2024.01.25 |