2009. 10. 20. 12:11

[Spring] Example: the PropertyPlaceholderConfiguerer / PropertyPlaceholderConfigurer 예제

원문: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/ch03s08.html#beans-factory-placeholderconfigurer

PropertyPlaceholderConfigurer는 bean 정의가 아니라 JavaProperties  형식의 파일에 property를 저장할 때 사용합니다. 이렇게 함으로써, 메인 XML 파일을 수정하는 위험이나 어려움 없이 어플리케이션을 배포할 때 환경에 맞게 데이터베이스 URL 이나 비밀번호 같은 property를 설정할 수 있습니다.

아래의 XML 기반 설정 메타데이터에  placeholder 와 함께  DataSource 값이 정의되어 있습니다. 이 예는 외부 Properties 파일에 설정된 property를 보여줍니다. 런타임에 PropertyPlaceholderConfigurer는 DataSource의 property를 교체할 메타데이터에 적용됩니다. 교체될 값은 Ant/Log4J/JSP EL 스타일을 따르는 ${property-이름} 형식의 'placeholder'에 명시되어 있습니다.
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations" value="classpath:com/foo/jdbc.properties"/>
    </property>
</bean>

<bean id="dataSource" destroy-method="close"
      class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>

실제 값은 표준 Java Properties 형식의 다른 파일에서 가져옵니다:

jdbc.driverClassName=org.hsqldb.jdbcDriver
jdbc.url=jdbc:hsqldb:hsql://production:9002
jdbc.username=sa
jdbc.password=root

그래서 문자열 ${jdbc.username}은 런타임에 'sa'라는 값으로 교체되고 이와 같은 방식으로 property 파일의 키에 해당하는 다른 placeholder 값도 교체됩니다. PropertyPlaceholderConfigurer는 placeholder 를 bean이 정의된 위치에서 확인합니다. placeholder의 prefix와 suffix는 설정할 수 있습니다.

스프링 2.5 에서 소개된 context 네임스페이스를 사용하여, 전용 설정 값의 property placeholder 를 설정할 수 있습니다. location 속성에 쉼표를 사용하여 여러 위치를 제공할 수 있습니다.

<context:property-placeholder location="classpath:com/foo/jdbc.properties"/>

PropertyPlaceholderConfigurer는 명시된 Properties 파일에서 property를 찾지 못하면 Java System properties에서도 property를 찾습니다. configurer 에 systemPropertiesMode를 설정함으로써 이 동작을 변경할 수 있습니다. configurer 동작은 세 가지 값을 가질 수 있습니다: always override, never override, override 입니다. 더 자세한 정보는  PropertyPlaceholderConfigurer 의 Javadoc 을 참고하십시오.

 


클래스 이름 대입 / Class name substitution

클래스 이름을 대입하기 위해 PropertyPlaceholderConfigurer를 사용할 수 있는데, 이 것은 런타임에 특정 클래스의 implementation을 선택할 때 유용합니다. 예를 들어:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <value>classpath:com/foo/strategy.properties</value>
    </property>
    <property name="properties">
        <value>custom.strategy.class=com.foo.DefaultStrategy</value>
    </property>
</bean>

<bean id="serviceStrategy" class="${custom.strategy.class}"/>

If the class cannot be resolved at runtime to a valid class, resolution of the bean fails when it is about to be created, which is during the preInstantiateSingletons() phase of an ApplicationContext for a non-lazy-init bean.