> Java > java지도 시간 > 본문

싱글톤 및 프로토타입 Spring Bean 범위: 자세한 탐색

WBOY
풀어 주다: 2024-09-01 08:30:32
원래의
951명이 탐색했습니다.

Singleton and Prototype Spring Bean Scopes: A Detailed Exploration

처음 Spring 작업을 시작했을 때 가장 흥미로웠던 개념 중 하나는 빈 스코프(Bean Scope)라는 아이디어였습니다. Spring은 Spring 컨테이너 내에서 생성된 Bean의 라이프사이클을 결정하는 다양한 Bean 범위를 제공합니다. 가장 일반적으로 사용되는 두 가지 범위는 Singleton과 Prototype입니다. 이러한 범위를 이해하는 것은 효율적이고 효과적인 Spring 애플리케이션을 설계하는 데 중요하므로 이에 대해 제가 배운 내용을 안내해 드리겠습니다.

Spring Bean 범위 이해

Spring에서 Bean은 Spring IoC(Inversion of Control) 컨테이너에 의해 인스턴스화되고, 조립되고, 관리되는 객체입니다. Bean 범위는 Bean 인스턴스가 생성되는 방법과 시기, 지속 기간 등 Bean의 수명 주기를 나타냅니다.

Spring은 여러 가지 Bean 범위를 제공하지만 제가 중점적으로 다룰 두 가지는 다음과 같습니다.

  • 싱글톤 스코프
  • 프로토타입 스코프

각 범위에는 특정 사용 사례가 있으며 올바른 사용 사례를 선택하면 애플리케이션의 동작과 성능에 큰 영향을 미칠 수 있습니다.

싱글톤 범위

싱글톤 범위는 Spring의 기본 범위이며 제가 가장 자주 사용하는 범위입니다. Singleton 범위로 Bean을 정의하면 Spring 컨테이너가 해당 Bean의 인스턴스를 하나만 생성하고 이 단일 인스턴스가 전체 애플리케이션 컨텍스트에서 공유된다는 의미입니다.

작동 방식

빈을 싱글톤으로 선언하면 애플리케이션 컨텍스트가 시작되는 동안이나 처음 참조될 때 처음 요청될 때 Spring이 빈 인스턴스를 생성합니다. 그 이후에는 이 Bean에 대한 모든 후속 요청이 동일한 인스턴스를 반환합니다.

다음은 간단한 예입니다.

@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyService();
    }
}
로그인 후 복사

이 예에서 myService()는 싱글톤 Bean입니다. Spring 컨텍스트에서 MyService 빈을 요청할 때마다 동일한 인스턴스를 얻게 됩니다.

싱글톤 빈의 사용 사례

Singleton 범위는 클라이언트별 정보를 보유하지 않는 Stateless Bean에 이상적이라는 것을 알았습니다. 예는 다음과 같습니다.

  • 서비스 클래스: 일반적으로 이러한 클래스에는 별도의 인스턴스 없이 애플리케이션 전체에서 공유할 수 있는 비즈니스 로직이 포함되어 있습니다.
  • DAO 클래스: 일반적으로 데이터베이스와 상호 작용하고 클라이언트별 상태를 유지하지 않으므로 단일 인스턴스로 충분합니다.

이점 및 고려 사항

Singleton Bean의 주요 이점은 메모리 효율성입니다. 단일 인스턴스를 재사용하면 애플리케이션이 더 적은 메모리를 소비하고 객체 생성 및 삭제에 따른 오버헤드가 최소화됩니다. 그러나 상태를 유지하는 싱글톤 빈에는 주의하는 것이 중요합니다. Singleton Bean이 실수로 상태(예: 인스턴스 변수)를 보유하는 경우 이 상태는 여러 클라이언트에서 공유되어 잠재적인 데이터 불일치가 발생할 수 있습니다.

프로토타입 범위

Singleton과 달리 Prototype 범위는 Spring 컨테이너에서 Bean이 요청될 때마다 새 Bean 인스턴스를 생성합니다. 이에 대해 알게 되었을 때 Prototype Bean은 사용할 때마다 새로운 인스턴스가 필요한 시나리오에 유용하다는 것이 분명해졌습니다.

작동 방식

Prototype 범위로 Bean이 정의되면 Spring은 Bean이 요청될 때마다 새 인스턴스를 반환합니다. Prototype Bean을 정의하는 방법은 다음과 같습니다.

@Configuration
public class AppConfig {
    @Bean
    @Scope("prototype")
    public MyService myService() {
        return new MyService();
    }
}
로그인 후 복사

이 예에서는 Spring 컨텍스트에서 MyService 빈을 요청할 때마다 Spring이 MyService의 새 인스턴스를 생성합니다.

프로토타입 빈의 사용 사례

프로토타입 Bean은 일종의 클라이언트별 상태를 유지하거나 사용할 때마다 고유한 구성이 필요한 Stateful Bean을 처리할 때 특히 유용합니다. 일반적인 사용 사례는 다음과 같습니다.

  • Command Objects: If I’m implementing a pattern like Command, where each command is executed separately and maintains its own state, a Prototype bean is the right choice.
  • Session or Request Scoped Beans: In web applications, beans that are specific to a user session or request can be defined as Prototype to ensure a new instance is created for each user or request.

Benefits and Considerations

The primary advantage of using Prototype beans is the flexibility it offers in creating new instances. This is particularly useful when dealing with stateful objects. However, there’s a trade-off in terms of performance and resource usage. Since a new instance is created every time, it can lead to higher memory consumption and more frequent garbage collection. Moreover, unlike Singleton beans, Spring does not manage the lifecycle of Prototype beans beyond creation, so I have to handle the destruction and cleanup of these beans manually.

Singleton vs. Prototype: Choosing the Right Scope

One of the key decisions I face when designing a Spring application is choosing between Singleton and Prototype scope. Here’s a summary of the factors I consider:

  • Statefulness: If the bean is stateless, Singleton is usually the best choice. For stateful beans, Prototype is more appropriate.
  • Resource Management: Singleton beans are more memory efficient since only one instance is maintained. Prototype beans, while offering more flexibility, consume more resources.
  • Lifecycle Management: Singleton beans are managed by the Spring container throughout their lifecycle. In contrast, I must manage the full lifecycle of Prototype beans.

Practical Example

Let me provide a practical scenario that might help clarify when to use each scope. Suppose I’m building an online shopping application.

  • Shopping Cart Service: This service would typically be stateless and would be a good candidate for a Singleton bean. There’s no need to create a new instance every time, and the same service can handle multiple requests.
  • Order Processing: On the other hand, the Order object that represents a customer’s order would be stateful, holding details specific to that order. Therefore, it should be a Prototype bean so that each order is handled by a separate instance of the Order class.

Mixing Scopes: A Word of Caution

One thing I’ve learned the hard way is that mixing Singleton and Prototype beans can lead to unexpected issues. For example, injecting a Prototype-scoped bean into a Singleton bean can result in the Singleton bean always using the same instance of the Prototype bean. To avoid this, I usually inject a Provider or use the @Lookup annotation to ensure a new instance of the Prototype bean is created every time it is needed.

@Service
public class SingletonService {

    @Autowired
    private Provider<MyPrototypeService> myPrototypeServiceProvider;

    public void usePrototypeService() {
        MyPrototypeService prototypeService = myPrototypeServiceProvider.get();
        prototypeService.execute();
    }
}
로그인 후 복사

In this example, myPrototypeServiceProvider.get() ensures that a new instance of MyPrototypeService is created every time it is called within the Singleton bean.

GoodBye !

Understanding the nuances of Singleton and Prototype bean scopes in Spring has been critical in my journey as a developer. Both scopes offer distinct advantages depending on the use case, and choosing the right one can significantly impact the performance and design of an application.

In my experience, Singleton is the go-to scope for most beans due to its efficiency and simplicity, while Prototype is reserved for those special cases where I need a fresh instance every time. By carefully considering the statefulness of my beans and how they are used within the application, I can make informed decisions that lead to better, more maintainable Spring applications.

위 내용은 싱글톤 및 프로토타입 Spring Bean 범위: 자세한 탐색의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿