2010-11-19 4 views
0

Spring 3을 사용하여 웹 응용 프로그램을 만들고 있고 Spring Expression Language의 힘을 이용하고 싶지만 문제가 발생했습니다. 내 bean 중 하나의 속성 값을 다른 bean의 메소드 호출 결과로 설정해야합니다. 내가 할 수있는 건 알지만, 문제는 그 메소드 호출의 결과는 빈이 초기화 된 후에 변경 될 수 있으며, 변경을 반영하기 위해 그 속성이 필요하다는 것이다. 예를 들면 : 나는 무엇을 말할 수에서SpEL을 사용하여 Spring bean 속성의 값을 업데이트하십시오.

<beans> 
... 
<bean name="guestList" class="java.util.ArrayList"></bean> 

<bean name="party" class="some.custom.class.Party"> 
    <property name="numberOfGuests" value="#{guestList.size()}" /> 
</bean> 
... 
</beans> 

numberOfGuests 필드는 party 필드에 액세스 할 때 처음으로 설정됩니다. 그러나 party 필드에 액세스 한 후에는 손님 수가 변경 될 수 있으며이를 반영하기 위해 numberOfGuests 필드가 필요합니다. 값을 업데이트해야 할 때마다 내 앱에서 numberOfGuests 필드를 다시 초기화하는 방법이 있습니까?

이것은 단지 예일 뿐이므로 guestList bean에 직접 액세스하는 것이 내 특정 상황에서는 작동하지 않습니다.

답변

2

당신은 봄이 게스트 목록 크기를 다시 계산해야 여러분의 빈을로드 할 때마다 프로토 타입 스코프 설정 한 경우 :

<bean name="party" class="some.custom.class.Party" scope="prototype"> 

그래서, party이 프로토 타입되고 있지만 guestList은 기본 범위는 싱글 톤 (머물 수를).

캐치 그러나있다 : 당신은 (싱글 톤) partyHost 같은 다른 콩을 가지고 있고,이 (프로토 타입 인) party 주입됩니다 경우 partyHost이 때문에, partyHost는, party의 다른 인스턴스를 얻을하지 않습니다 싱글 톤 (singleton)을 사용하고, 한 번만 종속성을 주입합니다. 따라서 이것이 작동하려면 업데이트 된 게스트 목록 크기가 필요한 모든 bean과 그 bean을 참조하는 bean 등 모두 프로토 타입이어야합니다.

둘 중 하나를 선택하거나 API를 통해 직접 Spring에 문의해야합니다. API를 사용하는 경우 원할 때 언제든지 호출하여 프로토 타입 bean의 새 인스턴스를 가져올 수 있으므로 업데이트 된 게스트 목록 크기를 얻을 수 있습니다.

applicationContext.getBean("myPrototype"); 

가능한 경우 Spring API를 피하는 것이 좋습니다. 일반적으로 개발자는 DI 프레임 워크에 결합되기를 원하지 않습니다.

0

# {guestlist.size()}의 예는 속성을 유지하는 정책이 아닌 속성의 초기 값만 설정합니다. 당신이 게으른 로딩을 사용하지 않는다고 가정 할 때 Spring은 시작할 때 애플리케이션 컨텍스트로부터 스프링 관리 Bean을 인스턴스화합니다. 이 시점부터 개발자는 속성 값 업데이트를 처리 할 수 ​​있습니다.

0

나는 빈에있는 목록 (guestList)을 주입하고 .size() 즉, 당신이 numberOfGuests 필요 자바 코드 매번에서 수동 방법을 호출하는 것입니다 할 가장 단순한 추측 것 :

package some.custom.class; 

public class Party { 
    private List<?> guestList; 
    // getter & setters 

    public int getNumberOfGuests() { 
    return guestList!=null ? guestList.size() : 0; 
    } 

} 

및 ...

<bean name="party" class="some.custom.class.Party"> 
    <property name="guestList" ref="guestList"/> 
</bean> 
+0

이것은 확실히 간단하지만 (선호되는! –

+0

당신 말이 맞아요. 요점을 알았어. 우리는 그때 좀 더 많은 정보가 필요합니다. 'guestList' 빈에 대한 직접적인 접근은 무엇이 문제입니까? –

관련 문제