복붙노트

[SPRING] ApplicationContext 객체로부터 속성 값을 얻으려면 어떻게해야합니까? (주석을 사용하지 않음)

SPRING

ApplicationContext 객체로부터 속성 값을 얻으려면 어떻게해야합니까? (주석을 사용하지 않음)

만약 내가 가지고 있다면:

@Autowired private ApplicationContext ctx;

getBean 메소드 중 하나를 사용하여 bean 및 자원을 확보 할 수 있습니다. 그러나, 나는 속성 값을 얻는 방법을 알아낼 수 없다.

분명히 다음과 같은 @Value 속성을 가진 새 bean을 생성 할 수 있습니다 :

private @Value("${someProp}") String somePropValue;

어떤 메소드를 ApplicationContext 객체에서 호출하여 bean을 autowiring하지 않고 그 값을 얻으려고합니까?

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

해결법

  1. ==============================

    1.SPeL 표현식이 동적이어야하는 경우에는 속성 값을 수동으로 가져옵니다.

    SPeL 표현식이 동적이어야하는 경우에는 속성 값을 수동으로 가져옵니다.

    somePropValue = ctx.getEnvironment().getProperty("someProp");
    
  2. ==============================

    2.$ {someProp} 속성이 PropertyPlaceHolderConfigurer에서 온다고 가정하면 그 일이 어려워집니다. PropertyPlaceholderConfigurer는 BeanFactoryPostProcessor이며 컨테이너 시작시에만 사용할 수 있습니다. 따라서 런타임시 등록 정보를 Bean에서 사용할 수 없습니다.

    $ {someProp} 속성이 PropertyPlaceHolderConfigurer에서 온다고 가정하면 그 일이 어려워집니다. PropertyPlaceholderConfigurer는 BeanFactoryPostProcessor이며 컨테이너 시작시에만 사용할 수 있습니다. 따라서 런타임시 등록 정보를 Bean에서 사용할 수 없습니다.

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

    @Component
    public class PropertyHolder{
    
        @Value("${props.foo}") private String foo;
        @Value("${props.bar}") private String bar;
    
        // + getter methods
    }
    

    이제이 PropertyHolder를 속성이 필요한 곳에 삽입하고 getter 메서드를 통해 속성에 액세스하십시오.

  3. ==============================

    3.Spring pre 3.1에서 멈춘다면,

    Spring pre 3.1에서 멈춘다면,

    somePropValue = ctx.getBeanFactory().resolveEmbeddedValue("${someProp}");
    
  4. from https://stackoverflow.com/questions/10822951/how-do-i-get-a-property-value-from-an-applicationcontext-object-not-using-an-a by cc-by-sa and MIT license