복붙노트

[SPRING] 스프링 빈 파괴 메소드, 싱글 톤 및 프로토 타입 스코프

SPRING

스프링 빈 파괴 메소드, 싱글 톤 및 프로토 타입 스코프

나는 스프링 프레임 워크에 익숙하지 않고, 그것을 배우기위한 튜토리얼을 시작했다.

나는 다음 파일들을 가지고있다.

# MainProgram.java

package test.spring;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainProgram {
        public static void main(String[] args) {
              AbstractApplicationContext context = 
                              new ClassPathXmlApplicationContext("Bean.xml");     
              HelloSpring obj = (HelloSpring) context.getBean("helloSpring");
              obj.setMessage("My message");
              obj.getMessage();
              context.registerShutdownHook();

        }
 }

# HelloSpring.java

package test.spring;

public class HelloSpring   {
     private String message;

     public void setMessage(String message){
      this.message  = message;
      System.out.println("Inside setMessage");
   }

   public void getMessage(){
      System.out.println("Your Message : " + this.message);
   }

   public void xmlInit() {
    System.out.println("xml configured  initialize");
   } 

    public void xmlDestroy() {
    System.out.println("xml configured destroy");
    }

  }

# Ben.hml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

     <bean id="helloSpring" class="test.spring.HelloSpring" 
          scope="prototype" init-method="xmlInit" destroy-method="xmlDestroy">

     </bean>
     </beans>

scope = "singleton"을 취하면 출력은 다음과 같습니다.

 xml configured  initialize
 Inside setMessage
 Your Message : My message
 xml configured destroy

scope = "prototype"을 취하면 출력은 다음과 같습니다.

 xml configured  initialize
 Inside setMessage
 Your Message : My message

xmlDestroy () 메소드가 싱글 톤 범위 Bean으로 호출되었지만 프로토 타입에서는 호출되지 않았습니다. 친절하게도 다음을 위해 나를 도와주세요.

이 올바른지? 그렇다면 가능한 이유는 무엇입니까?

또한 몇 가지 질문이 있습니다.

차이점은 무엇입니까? ApplicationContext, AbstractApplicationContext 및 ClassPathXmlApplicationContext

해결법

  1. ==============================

    1.xmlDestroy () 메소드가 싱글 톤 범위 Bean으로 호출되었지만 프로토 타입과 함께 호출되지 않았기 때문에

    xmlDestroy () 메소드가 싱글 톤 범위 Bean으로 호출되었지만 프로토 타입과 함께 호출되지 않았기 때문에

    Spring은 프로토 타입 빈의 전체 라이프 사이클을 관리하지 않습니다. 컨테이너는 프로토 타입 객체를 인스턴스화, 구성, 장식 및 조립하여 클라이언트에게 전달한 다음 해당 프로토 타입 인스턴스를 더 이상 알지 못합니다. 리소스를 해제하려면 사용자 정의 bean 포스트 프로세서를 구현하십시오.

    스프링 컨테이너가 전체 라이프 사이클을 관리하는 싱글 톤 빈과 달리

    다른 컨텍스트 간의 차이점에 대해서는이 기본 자습서를 살펴볼 수 있습니다

    참조 문서

  2. ==============================

    2.싱글 톤 Bean은 응용 프로그램 컨텍스트에 해당 Bean의 인스턴스가 정확히 하나 있음을 의미합니다. 즉, 다음과 같이하면됩니다.

    싱글 톤 Bean은 응용 프로그램 컨텍스트에 해당 Bean의 인스턴스가 정확히 하나 있음을 의미합니다. 즉, 다음과 같이하면됩니다.

    HelloSpring obj = (HelloSpring) context.getBean("helloSpring");
        obj.setMessage("My message");
        System.out.printIn(obj.getMessage());
        HelloSpring anotherObj = (HelloSpring) context.getBean("helloSpring");
        System.out.printIn(anotherObj.getMessage());
    

    콘솔 출력에 "내 메시지"가 두 번 표시됩니다.

    프로토 타입 빈의 경우 응용 프로그램 컨텍스트에서 그 중 하나를 얻으려고 할 때마다 새 인스턴스가 생성되므로 위 코드를 다시 실행하면 두 번째 콘솔 출력이 "null"이됩니다.

    컨테이너가 프로토 타입 빈에 대한 destroy 메소드를 호출 할 필요가 없으므로 컨테이너가 작동하지 않으며 올바르지 않습니다.

    앞서 말한 클래스의 차이점은 각각 인터페이스, 추상 클래스 및 구체적인 클래스라는 점입니다. Java 오라클 Java 튜토리얼의 공식 오라클 설명서를 읽어 보시기 바랍니다.

  3. ==============================

    3.이것이 예상되는 동작입니다. 프로토 타입 범위 bean의 사용이 끝났을 때 Spring이 알 수있는 방법이 없기 때문에 범위가 정의 된 원형을 위해 Spring에 의해 bean 파괴가 관리되지 않습니다. 문서에서 :

    이것이 예상되는 동작입니다. 프로토 타입 범위 bean의 사용이 끝났을 때 Spring이 알 수있는 방법이 없기 때문에 범위가 정의 된 원형을 위해 Spring에 의해 bean 파괴가 관리되지 않습니다. 문서에서 :

    자세한 정보는 Spring 문서를 참조하십시오.

    ApplicationContexts와 관련하여 애플리케이션에 가장 적합한 것을 선택할 수 있습니다. XML 또는 주석 bean 구성을 사용할 지 여부와 서블릿 컨테이너에서 실행 중인지 여부에 따라 다릅니다. ApplicationContext 자체는 heirarchy 유형의 루트에있는 인터페이스입니다.

  4. ==============================

    4.응용 프로그램은 10 밀리 초마다 프로토 타입 빈의 새 인스턴스를 요청하고 빈을 사용하여 작업 한 다음 범위를 벗어나게 할 수 있습니다. 응용 프로그램이 종료 될 때 Spring이 파괴해야한다면, 생성 된 모든 프로토 타입 bean에 대한 참조를 유지해야합니다. 따라서 이들을 가비지 수집하여 메모리 누수를 일으킬 수 있습니다.

    응용 프로그램은 10 밀리 초마다 프로토 타입 빈의 새 인스턴스를 요청하고 빈을 사용하여 작업 한 다음 범위를 벗어나게 할 수 있습니다. 응용 프로그램이 종료 될 때 Spring이 파괴해야한다면, 생성 된 모든 프로토 타입 bean에 대한 참조를 유지해야합니다. 따라서 이들을 가비지 수집하여 메모리 누수를 일으킬 수 있습니다.

  5. ==============================

    5.나 또한 범위가 "프로토 타입"인 bean의 destroy 이벤트를 얻으려고했다. 그래서 나는 위의 모든 대답을 읽고 그들의 대답을 시도합니다. 결과에서 프로토 타입 빈의 파멸을 감지 할 수있는 방법이 없다는 것을 알게되었습니다.

    나 또한 범위가 "프로토 타입"인 bean의 destroy 이벤트를 얻으려고했다. 그래서 나는 위의 모든 대답을 읽고 그들의 대답을 시도합니다. 결과에서 프로토 타입 빈의 파멸을 감지 할 수있는 방법이 없다는 것을 알게되었습니다.

    프로토 타입의 경우 범위에 관계없이 초기화 수명주기 콜백 메소드가 모든 객체에서 호출되지만 구성된 라이프 사이클 콜백은 호출되지 않습니다.

    여기 (https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/beans.html#beans-factory-scopes-prototype)를 참조하십시오.

  6. ==============================

    6.스프링 구성 파일에서 범위 유형을 확인하십시오. scope = "prototype"이면 scope = "singleton"으로 변경하십시오.

    스프링 구성 파일에서 범위 유형을 확인하십시오. scope = "prototype"이면 scope = "singleton"으로 변경하십시오.

    <bean id="helloWorld" class="com.example.test.HelloWorld"
    init-method="init" destroy-method="destroy">
    <property name="message" value="Hello World!" />
    

  7. from https://stackoverflow.com/questions/15040427/spring-bean-destroy-method-singleton-and-prototype-scopes by cc-by-sa and MIT license