2011-11-03 2 views
2

세션 범위의 Bean을 프록시없이 다른 세션 범위 Bean에 삽입하는 방법은 무엇입니까?Scoped Bean : 다른 하나에 주사하기

@Component 
@Scope("session") 
class Foo { 
    @Inject Bar bar; 
} 

@Component 
@Scope("session") 
class Bar { 
} 

오류 "No matching bean"을보고합니다. TARGET_CLASS scope-proxy는이 문제를 해결할 수 있지만 동일한 범위 Bean에 대해 프록시가 필요한 이유는 무엇입니까?

+0

호기심에서 벗어나'@ Inject' 대신'@ Autowired'를 사용하면 어떻게됩니까? – skaffman

+1

더 많은 정보를 포함시켜야합니다. 동일한 범위의 빈들 사이에 세션 범위가 지정된 빈을 프록시없이 연결하면됩니다. 당신의 코드에서 @Component 철자가 맞습니까? Bar 클래스가 구성 요소 스캔에 의해 선택 되었습니까? – mrembisz

+0

@mrembisz : 예, @Component입니다. 실수였습니다. '더 많은 정보 포함 '- 어떻게? –

답변

0

제 생각에는 - 주입 지점에서 스프링은 현재 빈의 범위에 따라 주입 된 빈을 구분하지 않기 때문입니다. 주입 대상 빈의 범위를 무시하고 (이 경우 세션에서) 대상 빈을 가져 오려면 프록시가 필요합니다.

+0

범위 인터페이스에는 conversationId가 있습니다. 두 세션 빈이 동일한 세션에 속해 있고 conversationId가 동일해야하며 프록시가 필요하지 않은 경우 그렇지 않습니까? 스코프 프록시는 현재 컨텍스트에 속한 Bean을 얻기 위해'Scope.get ("beanName")'을 즉시 호출하여 의존성을 깨뜨릴 수 있습니다. –

+0

글쎄요. Spring은 프록시를 해결 한 후에 그것을 적용 할 수있다. 나는 정확히 알지 못하지만, 어떻게 든 종속성을 주입하는 bean의 범위를 고려하지 않는 것이 좋다. – Bozho

+0

예를 들어 : 세션 : 1에 대해 foo : 1 (bar : proxy-> bar : 1)이 있고 나중에 세션 : 2에서 복원 된 bar : proxy가 bar : 2를 가리키고 foo : 1이 깨졌습니다. –

관련 문제