2012-05-30 1 views
27

(주석을 사용하지 않음). 그러나, 나는 속성 값을 얻는 방법을 알아낼 수 없다.ApplicationContext 개체에서 속성 값을 얻으려면 어떻게해야합니까?</p> <pre><code>@Autowired private ApplicationContext ctx; </code></pre> <p>나는하여의 getBean 방법 중 하나를 사용하여 콩과 자원을 얻을 수 있습니다 : 만약 내가

분명히, 나는 같은 @Value 속성이 새로운 빈을 만들 수 있습니다

private @Value("${someProp}") String somePropValue; 
나는 콩을 autowiring에없이 그 값을 얻기 위해 ApplicationContext는 객체를 호출 할 어떤 방법

?

보통 @Value를 사용하지만 SPeL 표현식이 동적이어야하는 상황이 있으므로 주석을 사용할 수 없습니다.

+0

(YourBeanType) ctx.getBean ("beanId"); –

답변

11

PropertyPlaceHolderConfigurer 속성이 ${someProp} 인 것으로 가정하면 작업이 어려워집니다. PropertyPlaceholderConfigurer는 BeanFactoryPostProcessor이며 컨테이너 시작시에만 사용할 수 있습니다. 따라서 런타임에 속성을 사용할 수 없습니다.

해결책은 필요한 속성/속성으로 초기화하는 일종의 값 홀더 빈을 만드는 것입니다.

@Component 
public class PropertyHolder{ 

    @Value("${props.foo}") private String foo; 
    @Value("${props.bar}") private String bar; 

    // + getter methods 
} 

이제 속성을 필요로 곳이 PropertyHolder를 주입하고, getter 메소드 SPEL식이 동적 필요가있는 경우

+0

예제는 여기에서 매우 유용 할 것입니다. – Webnet

+0

@Webnet ok, 작은 예제를 추가했습니다 –

+0

이 것은 'PropertyHolder'가 관리 빈일 필요가 없습니까? @HappyEngineer는 관리 빈이 아닌 솔루션을 찾고 있다고 생각합니다. – Webnet

33

에서 등록 정보를 엽니 다 수동으로 속성 값을 얻을 :

somePropValue = ctx.getEnvironment().getProperty("someProp"); 
당신은 3.1 미리 봄에 붙어있는 경우
+2

런타임시 환경을 사용하면 (시작 전용으로 apposed) JNDI를 비롯한 다른 위치를 탐색 할 때 매우 나쁜 생각입니다. 그 값은 비싸다. – kaqqao

8

, 당신은 사용할 수 있습니다

somePropValue = ctx.getBeanFactory().resolveEmbeddedValue("${someProp}");