[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.xmlDestroy () 메소드가 싱글 톤 범위 Bean으로 호출되었지만 프로토 타입과 함께 호출되지 않았기 때문에
xmlDestroy () 메소드가 싱글 톤 범위 Bean으로 호출되었지만 프로토 타입과 함께 호출되지 않았기 때문에
Spring은 프로토 타입 빈의 전체 라이프 사이클을 관리하지 않습니다. 컨테이너는 프로토 타입 객체를 인스턴스화, 구성, 장식 및 조립하여 클라이언트에게 전달한 다음 해당 프로토 타입 인스턴스를 더 이상 알지 못합니다. 리소스를 해제하려면 사용자 정의 bean 포스트 프로세서를 구현하십시오.
스프링 컨테이너가 전체 라이프 사이클을 관리하는 싱글 톤 빈과 달리
다른 컨텍스트 간의 차이점에 대해서는이 기본 자습서를 살펴볼 수 있습니다
참조 문서
-
==============================
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.이것이 예상되는 동작입니다. 프로토 타입 범위 bean의 사용이 끝났을 때 Spring이 알 수있는 방법이 없기 때문에 범위가 정의 된 원형을 위해 Spring에 의해 bean 파괴가 관리되지 않습니다. 문서에서 :
이것이 예상되는 동작입니다. 프로토 타입 범위 bean의 사용이 끝났을 때 Spring이 알 수있는 방법이 없기 때문에 범위가 정의 된 원형을 위해 Spring에 의해 bean 파괴가 관리되지 않습니다. 문서에서 :
자세한 정보는 Spring 문서를 참조하십시오.
ApplicationContexts와 관련하여 애플리케이션에 가장 적합한 것을 선택할 수 있습니다. XML 또는 주석 bean 구성을 사용할 지 여부와 서블릿 컨테이너에서 실행 중인지 여부에 따라 다릅니다. ApplicationContext 자체는 heirarchy 유형의 루트에있는 인터페이스입니다.
-
==============================
4.응용 프로그램은 10 밀리 초마다 프로토 타입 빈의 새 인스턴스를 요청하고 빈을 사용하여 작업 한 다음 범위를 벗어나게 할 수 있습니다. 응용 프로그램이 종료 될 때 Spring이 파괴해야한다면, 생성 된 모든 프로토 타입 bean에 대한 참조를 유지해야합니다. 따라서 이들을 가비지 수집하여 메모리 누수를 일으킬 수 있습니다.
응용 프로그램은 10 밀리 초마다 프로토 타입 빈의 새 인스턴스를 요청하고 빈을 사용하여 작업 한 다음 범위를 벗어나게 할 수 있습니다. 응용 프로그램이 종료 될 때 Spring이 파괴해야한다면, 생성 된 모든 프로토 타입 bean에 대한 참조를 유지해야합니다. 따라서 이들을 가비지 수집하여 메모리 누수를 일으킬 수 있습니다.
-
==============================
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.스프링 구성 파일에서 범위 유형을 확인하십시오. 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!" />
from https://stackoverflow.com/questions/15040427/spring-bean-destroy-method-singleton-and-prototype-scopes by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] mybatis 봄 mvc 응용 프로그램 가져 오기, 잘못된 바인딩 된 문 (찾을 수 없습니다) (0) | 2019.01.22 |
---|---|
[SPRING] 응답을 추출 할 수 없습니다 : 응답 유형에 적합한 HttpMessageConverter가 없습니다. (0) | 2019.01.22 |
[SPRING] JPA와 Spring을 사용하여 목록에서 필드가있는 고유 한 행을 찾는 방법? (0) | 2019.01.22 |
[SPRING] 한 컨트롤러 메서드에서 다른 컨트롤러 메서드로 리디렉션 (0) | 2019.01.22 |
[SPRING] @Autowire 이상한 문제 (0) | 2019.01.21 |