3

Count.java :컨트롤러에서 세션 범위가 지정된 구성 요소를 사용하는 방법

@Component 
@Scope(value = "session",proxyMode = ScopedProxyMode.TARGET_CLASS) 
public class Count { 
    Integer i; 
    public Count() { 
     this.i = 0; 
    } 

컨트롤러 : 난 경우에도 I

@Controller 
public class GreetingController { 
    @Autowired private Count count; 
    @RequestMapping("/greeting") 
    public String greetingForm(Model model) { 
     if(count.i == null) i == 0; 
     else i++; 
     model.addAttribute("count",String.valueOf(count.i)); 
     return "greeting"; 
    } 
} 

하지만 난이 컨트롤러 (/ 인사)를 실행할 때마다, 그것은 항상 증가 브라우저를 닫으십시오. 어떻게 Singleton Controller에서이 Session Scoped Component를 사용할 수 있습니까?

+0

[Spring request scope bean] (http://stackoverflow.com/questions/14731092/spring-request-scope-bean)의 가능한 복제본 – nowszy94

+1

'i'에 대한 getter를 생성하십시오. – zeroflagL

+0

@zeroflagL : 감사합니다. 그러나 당신은 그것을 설명 할 수 있습니까? 처음에는 세션 변수가 전역 변수처럼 작동합니다. 쿠키를 삭제할 때도 증가합니다. 하지만 setter/getter 대신 i ++를 사용하십시오. 그것은 매력처럼 작동합니다 – Snoob

답변

8

프록시는 메소드 호출만을 차단합니다. 귀하의 경우에는 다음과 같은 상황이 발생합니다

@Autowired private Count count; 

횟수의 인스턴스처럼 보이는 때문에 또한 i 필드가 프록시를 작성합니다. 그러나 프록시가 실제 것이 아니기 때문에 Count 생성자는 호출되지 않고 i은 초기화되지 않은 채로 남아 있습니다. 그래서 항상 null이됩니다.

이제 게터를 소개하자 : 현재 세션의 Count 빈의 인스턴스가있는 경우

class Count { 
    ... 
    public Integer getI() { 
    return i; 
    } 

당신이 getI() 프록시 첫번째 검사를 호출 할 때. 없으면 하나가 생성됩니다. 이는 또한 Count 생성자가 호출되고 i이 초기화되었음을 의미합니다. 그런 다음 프록시는 i 값을 리턴하는 bean의 getI()에 대한 호출을 위임합니다.

+0

anwser는 프록시가 무엇이며 어떻게 작동하는지 설명했습니다. D – Snoob

관련 문제