복붙노트

[SPRING] spring PropertyPlaceholderConfigurer 및 컨텍스트 : property-placeholder

SPRING

spring PropertyPlaceholderConfigurer 및 컨텍스트 : property-placeholder

나는 다음과 같은 bean 선언을 가지고있다 :

  <bean
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>WEB-INF/classes/config/properties/database.properties</value>
                <value>classpath:config/properties/database.properties</value>
            </list>
        </property>
        <property name="ignoreResourceNotFound" value="true"/>
    </bean>
<bean id="dataSource" 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>

이제 PropertyPlaceholderConfigurer를 다음 형식으로 변경하려고합니다.

<context:component-scan base-package="org.example.config"/>
<util:properties id="jdbcProperties" 
           location="classpath:config/properties/database.properties"/>

Spring 3 프레임 워크를 사용하고 있습니다.

해결법

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

    1.는 PropertyPlaceholderConfigurer에 해당하는 XML입니다. 그래서, 그것을 선호하십시오. 는 여러분이 주입 할 수있는 java.util.Properties 인스턴스를 단순히 생성합니다.

    는 PropertyPlaceholderConfigurer에 해당하는 XML입니다. 그래서, 그것을 선호하십시오. 는 여러분이 주입 할 수있는 java.util.Properties 인스턴스를 단순히 생성합니다.

    Spring 3.1 (3.0이 아닌)에서는 다음과 같이 할 수있다.

    @Configuration
    @PropertySource("/foo/bar/services.properties")
    public class ServiceConfiguration { 
    
        @Autowired Environment environment; 
    
        @Bean public javax.sql.DataSource dataSource( ){ 
            String user = this.environment.getProperty("ds.user");
            ...
        } 
    }
    

    Spring 3.0에서는 SpEl 주석을 사용하여 PropertyPlaceHolderConfigurer 메커니즘을 사용하여 정의 된 속성에 "액세스"할 수 있습니다.

    @Value("${ds.user}") private String user;
    

    XML을 모두 제거하려면 Java 구성을 사용하여 PropertyPlaceholderConfigurer를 수동으로 등록하십시오. 나는 3.1 접근법을 선호한다. 그러나 Spring 3.0 접근법을 사용하고 있다면 (3.1은 아직 GA가 아니기 때문에 ...), 이제 위의 XML을 다음과 같이 정의 할 수 있습니다.

    @Configuration 
    public class MySpring3Configuration {     
            @Bean 
            public static PropertyPlaceholderConfigurer configurer() { 
                 PropertyPlaceholderConfigurer ppc = ...
                 ppc.setLocations(...);
                 return ppc; 
            } 
    
            @Bean 
            public class DataSource dataSource(
                    @Value("${ds.user}") String user, 
                    @Value("${ds.pw}") String pw, 
                    ...) { 
                DataSource ds = ...
                ds.setUser(user);
                ds.setPassword(pw);                        
                ...
                return ds;
            }
    }
    

    PPC는 정적 bean 정의 메소드를 사용하여 정의됩니다. 이것은 PPC가 BeanFactoryPostProcessor이기 때문에 콩이 일찌기 등록되었는지 확인하는 데 필요합니다. 콩이 콩코드의 등록에 영향을 미칠 수 있으므로 다른 모든 것보다 먼저 등록되어야합니다.

  2. ==============================

    2.첫째, 두 위치를 모두 정의 할 필요가 없습니다. classpath : config / properties / database.properties를 사용하면됩니다. WAR에서 WEB-INF / classes는 classpath 항목이므로 잘 작동합니다.

    첫째, 두 위치를 모두 정의 할 필요가 없습니다. classpath : config / properties / database.properties를 사용하면됩니다. WAR에서 WEB-INF / classes는 classpath 항목이므로 잘 작동합니다.

    그 후에, 나는 당신이 구성자를 생성하기 위해 Spring의 스키마 기반 설정을 사용하기를 원한다는 것을 의미한다고 생각한다. 그것은 이렇게 갈 것입니다 :

    <context:property-placeholder location="classpath:config/properties/database.properties"/>
    

    "ignoreResourceNotFound"를 더 이상 사용하지 않아도됩니다. util : properties를 사용하여 속성을 별도로 정의해야하는 경우 :

    <context:property-placeholder properties-ref="jdbcProperties" ignore-resource-not-found="true"/>
    

    일반적으로 별도로 정의 할 이유가 없습니다.

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

    3.나를 위해 일한 다음 : 어떻게 든 "classpath : xxx"가 파일을 선택하지 않습니다.

    나를 위해 일한 다음 : 어떻게 든 "classpath : xxx"가 파일을 선택하지 않습니다.

  4. from https://stackoverflow.com/questions/7542506/spring-propertyplaceholderconfigurer-and-contextproperty-placeholder by cc-by-sa and MIT license