복붙노트

[SPRING] 응용 프로그램 컨텍스트에 속성을 추가하는 방법

SPRING

응용 프로그램 컨텍스트에 속성을 추가하는 방법

독립 실행 형 응용 프로그램이 있고이 응용 프로그램은 값 (속성)을 계산 한 다음 스프링 컨텍스트를 시작합니다. 내 질문은 스프링 컨텍스트에 계산 된 속성을 추가하여 속성 파일 (@Value ( "$ {myCalculatedProperty}"))에서로드 된 속성처럼 사용할 수있는 방법입니다.

그것을 조금 설명하기 위해

public static void main(final String[] args) {
    String myCalculatedProperty = magicFunction();         
    AbstractApplicationContext appContext =
          new ClassPathXmlApplicationContext("applicationContext.xml");
    //How to add myCalculatedProperty to appContext (before starting the context)

    appContext.getBean(Process.class).start();
}

ApplicationContext.xml :

<bean id="propertyPlaceholderConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations" value="classpath:*.properties" />
</bean>

<context:component-scan base-package="com.example.app"/>

이것은 Spring 3.0 애플리케이션이다.

해결법

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

    1.Spring 3.1에서는 독자적인 PropertySource를 구현할 수있다. Spring 3.1 M1 : Unified Property Management.

    Spring 3.1에서는 독자적인 PropertySource를 구현할 수있다. Spring 3.1 M1 : Unified Property Management.

    먼저 PropertySource 구현을 직접 만듭니다.

    private static class CustomPropertySource extends PropertySource<String> {
    
        public CustomPropertySource() {super("custom");}
    
        @Override
        public String getProperty(String name) {
            if (name.equals("myCalculatedProperty")) {
                return magicFunction();  //you might cache it at will
            }
            return null;
        }
    }
    

    이제 응용 프로그램 컨텍스트를 새로 고치기 전에이 PropertySource를 추가하십시오.

    AbstractApplicationContext appContext =
        new ClassPathXmlApplicationContext(
            new String[] {"applicationContext.xml"}, false
        );
    appContext.getEnvironment().getPropertySources().addLast(
       new CustomPropertySource()
    );
    appContext.refresh();
    

    이제부터는 Spring에서 새 속성을 참조 할 수 있습니다.

    <context:property-placeholder/>
    
    <bean class="com.example.Process">
        <constructor-arg value="${myCalculatedProperty}"/>
    </bean>
    

    또한 주석과 함께 작동합니다 (를 추가하십시오).

    @Value("${myCalculatedProperty}")
    private String magic;
    
    @PostConstruct
    public void init() {
        System.out.println("Magic: " + magic);
    }
    
  2. ==============================

    2.계산 된 값을 시스템 특성에 추가 할 수 있습니다.

    계산 된 값을 시스템 특성에 추가 할 수 있습니다.

    System.setProperty("placeHolderName", myCalculatedProperty);
    
  3. ==============================

    3.귀하의 예제에서와 같이 ApplicationContext 생성을 제어하는 ​​경우 항상 BeanRegistryPostProcessor를 추가하여 두 번째 PropertyPlaceholderConfigurer를 컨텍스트에 추가 할 수 있습니다. ignoreUnresolvablePlaceholders = "true"및 order = "1"이어야하고 Properties 개체를 사용하여 사용자 지정 계산 된 속성 만 확인해야합니다. 다른 모든 속성은 PropertyPlaceholderConfigurer가 order = "2"를 가져야하는 XML에서 확인해야합니다.

    귀하의 예제에서와 같이 ApplicationContext 생성을 제어하는 ​​경우 항상 BeanRegistryPostProcessor를 추가하여 두 번째 PropertyPlaceholderConfigurer를 컨텍스트에 추가 할 수 있습니다. ignoreUnresolvablePlaceholders = "true"및 order = "1"이어야하고 Properties 개체를 사용하여 사용자 지정 계산 된 속성 만 확인해야합니다. 다른 모든 속성은 PropertyPlaceholderConfigurer가 order = "2"를 가져야하는 XML에서 확인해야합니다.

  4. ==============================

    4.myCalculatedProperty는 특성 파일 (Spring propertyPlaceholderConfigurer에 의해 주입되는) 중 하나에 포함되어야합니다.

    myCalculatedProperty는 특성 파일 (Spring propertyPlaceholderConfigurer에 의해 주입되는) 중 하나에 포함되어야합니다.

    편집 : 단순히 이런 식으로 setter를 사용하십시오.

    public static void main(final String[] args) {
        String myCalculatedProperty = magicFunction();         
        AbstractApplicationContext appContext =
              new ClassPathXmlApplicationContext("applicationContext.xml");
    
        Process p = appContext.getBean(Process.class);
        p.setMyCalculatedProperty(myCalculatedProperty);
        p.start();
    }
    
  5. from https://stackoverflow.com/questions/9294187/how-to-add-properties-to-an-application-context by cc-by-sa and MIT license