spring PropertyPlaceholderConfigurer und context: property-placeholder



spring system properties (3)

Ich habe folgende Bean Deklaration:

  <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>

Jetzt möchte ich über PropertyPlaceholderConfigurer in folgendes Format wechseln:

<context:component-scan base-package="org.example.config"/>
<util:properties id="jdbcProperties" 
           location="classpath:config/properties/database.properties"/>
  1. ignoreResourceNotFound ignoriert die Eigenschaft beim Ausführen. zB: Beim Testen der Anwendung ignoriert WEB-INF / .. den Pfad (da maven Projekt- und Eigenschaftendatei unter src / main / resources / .. steht), während der Start der Webanwendung ignoriert andere Eigenschaft den Pfad, den ich mit implementieren muss oberes Format.
  2. sollte in der Lage sein, mehrere Eigenschaftendateien wie database.properties, test.properties usw. hinzuzufügen.
  3. kann ich im Frühling 3 Annotation statt dieser XML-Dateien zum DB-Laden verwenden, wie kann ich das tun? da ich nur eine xml-datei (wie oben angegeben) verwende, um db-stuff zu laden.

Ich benutze Spring 3 Framework.


Folgendes hat für mich funktioniert:
<context:property-placeholder location="file:src/resources/spring/AppController.properties"/>

Irgendwie wählt "classpath: xxx" die Datei nicht aus.


<context:property-placeholder ... /> ist die XML-Entsprechung zu PropertyPlaceholderConfigurer. Also, bevorzuge das. Mit <util:properties/> einfach eine java.util.Properties-Instanz <util:properties/> , die Sie injizieren können.

Im Frühjahr 3.1 (nicht 3.0 ...) können Sie so etwas tun:

@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");
        ...
    } 
}

In Frühling 3.0 können Sie auf Eigenschaften zugreifen, die mithilfe des PropertyPlaceHolderConfigurer-Mechanismus mithilfe der SpEl-Annotationen definiert wurden:

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

Wenn Sie den XML-Code alle zusammen entfernen möchten, registrieren Sie den PropertyPlaceholderConfigurer manuell mithilfe der Java-Konfiguration. Ich bevorzuge den 3.1-Ansatz. Aber wenn Sie den Spring 3.0-Ansatz verwenden (seit 3.1 ist noch nicht GA ...), können Sie jetzt das obige XML wie folgt definieren:

@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;
        }
}

Beachten Sie, dass der PPC mithilfe einer static Bean-Definitionsmethode definiert wird. Dies ist erforderlich, um sicherzustellen, dass die Bean früh registriert wird, da der PPC ein BeanFactoryPostProcessor - er kann die Registrierung der Beans selbst in dem Kontext beeinflussen, so dass er notwendigerweise vor allem anderen registriert werden muss.


Zunächst müssen Sie diese beiden Standorte nicht definieren. Verwenden Sie einfach classpath:config/properties/database.properties . In einer WAR ist WEB-INF/classes ein Klassenpfad-Eintrag, also wird es gut funktionieren.

Danach denke ich, was du meinst, willst du die schemabasierte Konfiguration von Spring verwenden, um einen Konfigurator zu erstellen . Das würde so gehen:

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

Beachten Sie, dass Sie "ignoreResourceNotFound" nicht mehr ignorieren müssen. Wenn Sie die Eigenschaften separat mit util:properties :

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

Es gibt normalerweise keinen Grund, sie getrennt zu definieren.





spring