2015-01-15 3 views
0

웹 컨텍스트에서 봄의 범위를 이해하려고합니다. 나는 다음과 같이 구성 파일에 정의 된 콩라는 선수가 있습니다스프링 싱글 톤 범위가 웹 응용 프로그램에서 작동하지 않습니다.

<bean id="playerBean" class="com.anvesh.model.Player" scope="singleton"/> 

가 그럼 난 RequestController 역할을 서블릿이 (JSP를의 모든 제출 요청을 것이 서블릿을 통해 경로).

이 서블릿 요청 1의 두 가지 유형을 처리

XmlWebApplicationContext ctx = new XmlWebApplicationContext(); 
ctx.setConfigLocation("/WEB-INF/WebAppContext.xml"); 
ctx.setServletContext(getServletContext()); 
ctx.refresh(); 
) loginValidate은 "loginValidate는"내가 만드는 오전 호출 2) getFutureMatches

:이 서블릿에서 나는 다음과 같이 스프링 구성 파일을 초기화하고 (아래처럼) 플레이어 빈과 PlayerHomePage.jsp을 갈 것를 제어합니다 PlayerHomePage.jsp에서

player = ctx.getBean("playerBean",Player.class); 
player.setName("Anveshan"); 
player.setExp(10); 
player.setId(3175); 
player.setQualification("B.Tech"); 
System.out.println("In the validate Login :"+player); 
response.sendRedirect("/SpringRefernce_Scope/Jsp/PlayerHomePage.jsp"); 

, 나는 "getFutureMatches"조치를 호출. 그래서 다시 컨트롤이 RequestController에 올 것입니다. 여기서는 플레이어 빈을 아래처럼 접근하려고합니다.

player = ctx.getBean("playerBean",Player.class); 

그러나 플레이어가 null이됩니다.

playerBean을 싱글 톤으로 정의 했으므로 일단 인스턴스화되면 다른 곳에서 호출 될 때마다 동일한 bean을 반환해야합니다. 이것은 XmlWebApplicationContext를 사용할 때 ApplicationContext.but을 사용할 때 올바르게 발생합니다. 단 하나의 비아는 유지되지 않습니다.

--- 범위를 세션/응용 프로그램으로 사용할 때 "getFutureMatches"동작에서도 내 플레이어 bean이 NULLIFIED되지 않습니다. 나는 이전 요청에서 초기화 된 Player 객체를 얻을 수 있습니다. 그러나 나는 왜 싱글렛이 그렇게하지 않는지 이해할 수 없다. 도와주세요.

스프링 - mvc를 사용하고 있지 않음에 유의하십시오. 내 web.xml의 항목은 다음과 같습니다 :

나는 포스트 방법으로 설정 파일 코드의 초기화를 유지했기 때문에
<listener> 
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
    </listener> 

    <servlet> 
    <servlet-name>requestController</servlet-name> 
    <servlet-class>com.anvesh.servlet.RequestController</servlet-class> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>requestController</servlet-name> 
    <url-pattern>/RequestController</url-pattern> 
    </servlet-mapping> 
+0

새로운 '컨텍스트'를 생성하는 경우 새 빈을 얻게됩니다. 원래의 bean은 동일한 컨텍스트가 사용되는 경우에만 리턴됩니다. – Rohit

답변

0

, XmlWebApplicationContext이 초기화 될 때마다 포스트 메소드가 호출된다. refresh()가 호출 될 때마다, 싱글 톤 객체는 손실됩니다. 아래 초기화 코드를 서블릿의 init() 메소드로 옮겼습니다. 이제 refresh()는 post()가 호출 될 때마다 호출되지 않으므로 싱글 톤 객체가 유지됩니다.

XmlWebApplicationContext ctx = new XmlWebApplicationContext(); 
ctx.setConfigLocation("/WEB-INF/WebAppContext.xml"); 
ctx.setServletContext(getServletContext()); 
ctx.refresh(); 

매번 ctx.refresh()를 사용하더라도 세션 개체가 유지되는 방식을 여전히 이해할 수 없습니다.

+1

실제로 콩은 파괴되지 않습니다. 새 컨텍스트를 만들 때마다 새로운 bean을 얻습니다. 그래서 매번 새로운 콩을 모두 얻을 것입니다. 스스로로드하는 대신에 그 코드를 제거하고 web.xml에 컨피그레이션을로드하는'ContextLoaderListener'를 등록하는 것이 좋습니다. 그런 다음 코드에서 컨텍스트를 간단히 조회 할 수 있습니다. 또한 플레이어가 웹 사이트의 모든 사용자가 동일한 인스턴스를 공유하는 싱글 톤이므로 코드에 결함이있는 것으로 보입니다. 나는 그것이 당신의 의도 된 사용법이라고 생각하지 않습니다. –

+0

감사합니다 Deinum, 내가 언급 한대로 ContextLoaderListener를 사용합니다 .... 위의 코드는 싱글 톤 요청 및 세션 범위를 테스트하기 위해 작성한 샘플 코드이며 그 이유는 싱글 톤으로 플레이어를 만든 이유입니다. 생산 코드가 아닙니다. – Anveshan

관련 문제