봄 워크숍에는 능숙하고 부지런한 조수인 콩이 함께 일했습니다. 그들 각각에게는 장난감을 만들고, 사탕을 분류하고, 밝은 꽃을 키우는 등 자신만의 고유한 임무가 부여되었습니다.
워크샵 작업이 질서 있고 효율적이도록 하기 위해 빈, 즉 스코프에 대한 명확한 규칙이 확립되었습니다. 이러한 규칙은 Bean이 존재할 수 있는 기간과 동시에 생성할 수 있는 동일한 종류의 인스턴스 수를 결정합니다. 이러한 마법 같은 프레임워크 덕분에 워크숍이 원활하고 안정적으로 진행되었습니다.
누군가 파이를 주문할 때마다 고슴도치 베이커는 독특한 재료로 새로운 파이를 만듭니다.
고슴도치: "사람은 각자 자신만의 맛을 원해요! 그래서 주문할 때마다 신선한 파이를 만들어요."
@Component @Scope("prototype") public class Hedgehog { public void bakePie() { System.out.println("Пеку пирог!"); } }
Spring에서 prototype 범위가 작동하는 방식은 다음과 같습니다. 새 객체가 요청될 때마다 고유한 Bean 인스턴스가 생성됩니다. 이는 각 용도에 대해 격리된 논리가 필요할 때 유용합니다.
예:
애플리케이션에는 각 사용자에 대한 보고서를 생성하는 Bean이 있습니다.
@Component @Scope("prototype") public class ReportGenerator { public Report generate(String userData) { // Генерация уникального отчета return new Report(userData); } }
context.getBean(ReportGenerator.class)을 호출할 때마다 새 인스턴스가 생성됩니다. 이는 다중 사용자 시스템에서 고유한 데이터를 처리하는 데 편리합니다.
분배하는 토끼는 조수에게 다음과 같이 설명합니다.
"공터에 오시는 손님마다 당근을 모아두는데, 손님이 떠나자마자 바구니가 나에게 돌아옵니다."
@Component @Scope("prototype") public class Hedgehog { public void bakePie() { System.out.println("Пеку пирог!"); } }
Request 범위는 각 HTTP 요청에 대해 하나의 Bean이 생성됨을 의미합니다. 요청이 완료되면 해당 빈은 파기됩니다.
사용 예:
웹 애플리케이션에 사용자 데이터를 수집하는 구성 요소가 있다고 상상해 보세요.
@Component @Scope("prototype") public class ReportGenerator { public Report generate(String userData) { // Генерация уникального отчета return new Report(userData); } }
각 사용자 요청에는 HTTP 요청 처리의 일부로만 '활성화'되는 고유한 바구니가 할당됩니다. 요청이 완료되면 Bean이 삭제되어 메모리가 해제됩니다.
프로토타입: 테스트, 고유한 데이터 생성, 격리된 작업 처리 등 각 호출마다 고유한 인스턴스가 필요한 작업에 사용됩니다.
요청: 웹 애플리케이션에서 사용자 요청 간에 데이터 격리를 제공하는 데 유용합니다. 예를 들어 장바구니, 인증 데이터 또는 임시 토큰이 있습니다.
접근 방식의 차이:
프로토타입은 콘솔 애플리케이션을 포함한 모든 상황에서 사용될 수 있습니다.
요청은 HTTP 요청에 의존하기 때문에 웹 컨텍스트에 엄격하게 바인딩됩니다.
Bob the Builder는 숲에서 일하며 모두를 위해 댐을 만듭니다. 그는 이렇게 말합니다.
"나는 혼자이고, 아무리 많은 동물이 와도 무엇이든 만들 것이다!"
이는 모든 클라이언트가 액세스하는 객체의 인스턴스가 항상 동일하다는 것을 의미합니다. 그리고 같은 밥이 올 때마다. 그는 복제되거나 사라질 필요가 없었습니다. 그래서 그는 날마다 일했습니다.
@Component @Scope("prototype") public class Hedgehog { public void bakePie() { System.out.println("Пеку пирог!"); } }
싱글톤은 Spring의 기본 범위입니다. 애플리케이션 전체 기간 동안 하나의 Bean 인스턴스가 생성됩니다. 이 빈은 객체가 모든 애플리케이션 구성요소 사이에서 공유 리소스여야 할 때 사용됩니다.
사용 예:
로깅 구성 요소가 있다고 가정해 보겠습니다.
@Component @Scope("prototype") public class ReportGenerator { public Report generate(String userData) { // Генерация уникального отчета return new Report(userData); } }
이 Bean은 한 번 생성되면 모든 애플리케이션 구성요소가 이를 사용하여 로그를 기록합니다. 이는 효율적이며 메모리를 절약합니다.
신청:
꼬마 곰은 집에 찾아오는 손님을 위해 꿀을 요리해요. 그는 이렇게 말합니다.
"당신이 나를 방문하는 동안 나는 당신의 허니팟을 돌본다. 그러나 당신이 떠나자마자 당신의 허니팟은 사라진다."
@Component @Scope("request") public class Rabbit { public void giveCarrot() { System.out.println("Вот твоя морковка!"); } }
Spring의 세션 범위는 사용자의 HTTP 세션이 지속되는 동안 Bean이 존재한다는 것을 의미합니다.
기술적 설명:
이 범위는 웹 애플리케이션에서 개체를 특정 사용자 세션에 바인딩하는 데 사용됩니다. 세션이 끝나면 Bean은 소멸됩니다.
사용 예:
사용자 인증 데이터를 저장하는 구성요소가 있다고 상상해 보세요.
@Component @Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS) public class UserCart { private List<Item> items = new ArrayList<>(); public void addItem(Item item) { items.add(item); } public List<Item> getItems() { return items; } }
이 Bean은 세션이 지속되는 동안 각 사용자에 대해 생성됩니다.
신청:
부엉이 필은 매일 저녁 숲에 사는 모든 사람들에게 동화를 들려줍니다. 그는 이렇게 말합니다.
"내 동화는 숲 전체에 단 하나뿐이에요. 모두가 내 말을 들으러 오고, 모두에게 충분해요!"
@Component @Scope("prototype") public class Hedgehog { public void bakePie() { System.out.println("Пеку пирог!"); } }
범위애플리케이션은 전체 애플리케이션에 대해 Bean이 한 번 생성되지만 웹 애플리케이션 컨텍스트에서만 사용된다는 점에서 싱글톤과 다릅니다.
이 범위는 싱글톤과 유사하지만 웹 컨텍스트에 의해 제어됩니다. 애플리케이션 전체에서 액세스해야 하는 구성 요소에 사용됩니다.
사용 예:
예를 들어 전역 설정을 저장하는 빈은 다음과 같습니다.
@Component @Scope("prototype") public class ReportGenerator { public Report generate(String userData) { // Генерация уникального отчета return new Report(userData); } }
이 Bean은 한 번 생성되면 누구나 사용할 수 있습니다.
신청:
Scope | Жизненный цикл | Пример использования |
---|---|---|
Singleton | Всё время работы приложения | Логирование, работа с базами данных |
Prototype | Новый объект при каждом вызове | Генерация отчётов, тестирование |
Request | Один HTTP-запрос | Корзина покупок, временные данные |
Session | Вся HTTP-сессия пользователя | Данные авторизации, настройки пользователя |
Application | Всё время работы приложения | Глобальные настройки, кэш на уровне приложения |
언제 무엇을 사용하나요?
싱글톤 - 공유되고 변경되지 않는 리소스용.
프로토타입 - 격리된 작업을 위한 고유한 데이터입니다.
요청 - 한 번의 요청 내 임시 데이터에 대한 것입니다.
세션 - 동일한 사용자의 요청 간에 저장되어야 하는 데이터용.
애플리케이션 - 모든 사용자가 사용하는 글로벌 데이터용.
위 내용은 매직 스코프: Spring이 빈을 구성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!