programing

봄콩 스코프

powerit 2023. 10. 5. 23:33
반응형

봄콩 스코프

누가 내가 항상 '원형'을 사용해왔던 봄콩의 스코프가 무엇인지 설명해줄 수 있나요? 하지만 내가 그것을 대신할 수 있는 다른 매개 변수가 있나요?

내가 말하는 것의 예시.

<bean id="customerInfoController" class="com.action.Controller" scope="prototype">
    <property name="accountDao" ref="accountDao"/>
    <property name="utilityDao" ref="utilityDao"/>
    <property name="account_usageDao" ref="account_usageDao"/>  
</bean>

스프링 사양에서 지원되는 콩 스코프는 다음과 같은 다섯 가지 유형은 다음과 같습니다.

1. 싱글톤(기본값*)

Spring IoC 컨테이너당 단일 개체 인스턴스에 대한 단일 빈 정의 범위를 지정합니다.

2. 원형의

개체 인스턴스 수에 관계없이 단일 빈 정의의 범위를 지정합니다.

3. 부탁합니다

단일 빈 정의를 단일 HTTP 요청의 라이프사이클에 적용합니다. 즉, 모든 HTTP 요청에는 단일 빈 정의 뒤에 생성된 고유한 빈 인스턴스가 있습니다.웹 인식 Spring ApplicationContext의 컨텍스트에서만 유효합니다.

4. 회기중

단일 빈 정의를 HTTP 세션의 라이프사이클에 적용합니다.웹 인식 Spring ApplicationContext의 컨텍스트에서만 유효합니다.

5. 전세계 세션

단일 빈 정의를 글로벌 HTTP 세션의 라이프사이클에 적용합니다.일반적으로 포틀렛 컨텍스트에서 사용할 경우에만 유효합니다.웹 인식 Spring ApplicationContext의 컨텍스트에서만 유효합니다.

는 * 는합니다에 합니다.<bean />tag. 여기서 더 자세히 읽어보세요: http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch04s04.html

봄에는 빈 스코프가 스프링 컨테이너에서 호출자에게 반환할 빈 인스턴스 유형을 결정하는 데 사용됩니다.

5가지 종류의 콩 스코프가 지원됩니다.

  1. Singleton : Spring IoC 컨테이너 당 단일 bean 인스턴스를 반환합니다.이 단일 인스턴스는 이러한 싱글톤 빈의 캐시에 저장되며, 이름이 지정된 빈에 대한 모든 후속 요청 및 참조는 캐시된 개체를 반환합니다.bean 구성 파일에 bean scope가 지정되지 않은 경우 singleton으로 기본 설정합니다.

  2. Prototype : 요청 시마다 새로운 bean 인스턴스를 반환합니다.싱글톤과 같은 캐시 버전은 저장하지 않습니다.

  3. Request : HTTP 요청당 단일 bean 인스턴스를 반환합니다.

    enter image description here

  4. Session : HTTP 세션(User level session)당 단일 빈 인스턴스를 반환합니다.

  5. GlobalSession : 글로벌 HTTP 세션당 단일 빈 인스턴스를 반환합니다.웹 인식 Spring ApplicationContext(애플리케이션 수준 세션)에서만 유효합니다.

대부분의 경우 Spring의 핵심 스코프인 싱글톤프로토타입만 다룰 수 있으며 기본 스코프는 싱글톤입니다.

Spring 5에서 Spring 문서에 언급된 것처럼 Spring은 6개의 범위를 지원하며, 이 중 4개는 웹 인식 ApplicationContext를 사용하는 경우에만 사용할 수 있습니다.

singleton(기본값) Spring IoC 컨테이너당 단일 개체 인스턴스에 대한 단일 빈 정의의 범위를 지정합니다.

프로토타입은 개체 인스턴스의 수에 관계없이 단일 빈 정의의 범위를 지정합니다.

request 단일 빈 정의를 단일 HTTP 요청의 라이프사이클에 적용합니다. 즉, 각 HTTP 요청에는 단일 빈 정의 뒤에 생성된 고유한 빈 인스턴스가 있습니다.웹 인식 Spring ApplicationContext의 컨텍스트에서만 유효합니다.

session HTTP 세션의 라이프사이클에 대한 단일 빈 정의 범위를 지정합니다.웹 인식 Spring ApplicationContext의 컨텍스트에서만 유효합니다.

응용 프로그램 서블릿 컨텍스트의 라이프사이클에 대한 단일 빈 정의 범위를 지정합니다.웹 인식 Spring ApplicationContext의 컨텍스트에서만 유효합니다.

웹소켓 스코프는 웹소켓의 라이프사이클에 대한 단일한 정의를 제공합니다.웹 인식 Spring ApplicationContext의 컨텍스트에서만 유효합니다.

스프링 설명서에서는 다음 표준 범위에 대해 설명합니다.

singleton: (Default) Spring IoC 컨테이너당 단일 개체 인스턴스로 단일 빈 정의의 범위를 지정합니다.

프로토타입:개체 인스턴스 수에 관계없이 단일 빈 정의의 범위를 지정합니다.

request: 단일 bean 정의를 단일 HTTP 요청의 라이프사이클로 스코프합니다. 즉, 각 HTTP 요청에는 단일 bean 정의 뒤에 생성된 고유한 bean 인스턴스가 있습니다.웹 인식 Spring ApplicationContext의 컨텍스트에서만 유효합니다.

session: 단일 bean 정의를 HTTP 세션의 라이프사이클에 적용합니다.웹 인식 Spring ApplicationContext의 컨텍스트에서만 유효합니다.

global session: 단일 빈 정의를 글로벌 HTTP Session의 라이프사이클에 적용합니다.일반적으로 포틀렛 컨텍스트에서 사용할 경우에만 유효합니다.웹 인식 Spring ApplicationContext의 컨텍스트에서만 유효합니다.

를 하여 추가 지정 를 만들고 할 수도 .CustomScopeConfigurer를 들어 . 를 들 수 있습니다.flow범위는 Spring Webflow에 의해 추가됩니다.

이 항상 를 합니다.prototype내가 이상하게 여기는 것.과 같습니다.singleton제가 개발하는 애플리케이션에서는 프로토타입 범위가 거의 필요하지 않습니다.이걸 한 번 보세요.

각각의 범위에 대한 자세한 설명은 여기 봄 콩 스코프에서 확인 할 수 있습니다.아래는 요약본입니다.

Singleton - (기본값) Spring IoC 컨테이너당 단일 개체 인스턴스로 단일 빈 정의의 범위를 지정합니다.

prototype - 개체 인스턴스의 수에 관계없이 단일 빈 정의의 범위를 지정합니다.

request - 단일 빈 정의를 단일 HTTP 요청의 라이프사이클에 적용합니다. 즉, 각 HTTP 요청에는 단일 빈 정의 뒤에 생성된 고유한 빈 인스턴스가 있습니다.웹 인식 Spring ApplicationContext의 컨텍스트에서만 유효합니다.

session - 단일 빈 정의를 HTTP 세션의 라이프사이클에 적용합니다.웹 인식 Spring ApplicationContext의 컨텍스트에서만 유효합니다.

global session - 단일 빈 정의를 글로벌 HTTP 세션의 라이프사이클에 적용합니다.일반적으로 포틀렛 컨텍스트에서 사용할 경우에만 유효합니다.웹 인식 Spring ApplicationContext의 컨텍스트에서만 유효합니다.

예로 을 들 수 있습니다.@Scope("singleton") 및 ))@Scope("prototype"):

DAO 클래스:

package com.example.demo;

public class Manager {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

구성:

@Configuration
public class AppConfiguration {
    @Bean
    @Scope("singleton")
    public Manager getManager(){
        return new Manager();
    }
}

MainApp:

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        context.scan("com.example.demo");
        context.refresh();

        Manager firstManager = context.getBean(Manager.class);
        firstManager.setName("Karol");

        Manager secondManager = context.getBean(Manager.class);
        System.out.println(secondManager.getName());
    }

}

에서는 결과가 .Karol우리가 이 말입니다.firstManager물건. 에서 객체가 하나 Spring IoC container에서 객체 인스턴스가 하나 생성되었기 때문입니다.로 변경할 때@Scope("prototype")다.nullSpring IoC 컨테이너는 해당 bean에 대한 요청이 있을 때 개체의 새로운 bean 인스턴스를 생성하기 때문입니다.

문서에 의하면Spring-Cloud-Config기존 5개 옆에 1개의 추가 범위가 있습니다.그렇다.@RefreshScope.

은 입니다에 입니다.RefreshScope:

구성이 변경되면 @RefreshScope로 표시된 Spring @Bean이 특별 처리됩니다.이 기능은 초기화할 때에만 구성을 주입하는 상태 저장 콩 문제를 해결합니다.예를 들어, 데이터베이스 URL이 환경을 통해 변경될 때 DataSource에 열린 연결이 있는 경우 해당 연결 보유자가 수행 중인 작업을 완료할 수 있기를 원할 수 있습니다.그런 다음에 풀에서 연결을 빌리면 새 URL과 함께 연결이 나타납니다.

때로는 한 번만 초기화할 수 있는 일부 원두에 @RefreshScope 주석을 적용해야 할 수도 있습니다.빈이 " 불변"인 경우 @RefreshScope로 빈에 주석을 달거나 속성 키 spring.cloud.refresh.extra-refreshable 아래에 클래스 이름을 지정해야 합니다.

새로 고침 범위 빈은 사용될 때(즉, 메서드가 호출될 때) 초기화되는 게으른 프록시이며 범위는 초기화된 값의 캐시 역할을 합니다.다음 메서드 호출에서 bean을 강제로 다시 초기화하려면 해당 캐시 항목을 무효화해야 합니다.

RefreshScope는 컨텍스트의 빈이며 대상 캐시를 지움으로써 스코프의 모든 빈을 새로 고치기 위한 공개 refreshAll() 메서드가 있습니다./refresh 끝점은 HTTP 또는 JMX를 통해 이 기능을 노출합니다.이름으로 개별 콩을 새로 고치기 위해서는 새로 고치기(String) 방법도 있습니다.

원형 콩 정보:

클라이언트 코드는 프로토타입 범위 개체를 정리하고 프로토타입 빈이 보유하고 있는 값비싼 리소스를 해제해야 합니다.Spring 용기가 원형 범위의 콩이 가지고 있는 자원을 방출하도록 하려면 세척이 필요한 콩을 참조할 수 있는 맞춤형 콩 후처리기를 사용해 보십시오.

ref : https://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html#beans-factory-scopes-prototype

웹소켓 범위도 추가됩니다.

단일 빈 정의를 WebSocket의 라이프사이클에 적용합니다.웹 인식 Spring ApplicationContext의 컨텍스트에서만 유효합니다.

문서의 내용에 따라 기본적으로 등록되지 않은 스레드 범위도 있습니다.

언급URL : https://stackoverflow.com/questions/17599216/spring-bean-scopes

반응형