2010-06-04 16 views
9

¿Cómo se configura un contenedor de bean Spring (o contexto de aplicación) para cargar un archivo de propiedades Java?¿Cómo se configura un contenedor de bean Spring para cargar un archivo de propiedades Java?

JavaWorld artículo Smartly Load Your Properties explica cómo cargar archivos de propiedades de la ruta de clases usando uno de los siguientes métodos de procesamiento de recursos en la biblioteca estándar de Java:

ClassLoader.getResourceAsStream ("some/pkg/resource.properties"); 
Class.getResourceAsStream ("/some/pkg/resource.properties"); 
ResourceBundle.getBundle ("some.pkg.resource"); 

¿Cómo se puede hacer lo mismo utilizando un depósito de granos de la primavera?

Respuesta

15

El Spring Framework Reference Documentation (2.5.x) da dos ejemplos de cómo cargar un archivo de propiedades en un recipiente de granos, una antes del lanzamiento de la versión 2.5 y de una manera más concisa utilizando la función <util:properties/> que se introdujo en la versión 2.5:

Antes de la versión 2.5:

<!-- creates a java.util.Properties instance with values loaded from the supplied location --> 
<bean id="jdbcConfiguration" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
    <property name="location" value="classpath:com/foo/jdbc-production.properties"/> 
</bean> 

Después de la versión 2.5:

<!-- creates a java.util.Properties instance with values loaded from the supplied location --> 
<util:properties id="jdbcConfiguration" location="classpath:com/foo/jdbc-production.properties"/> 

Tenga en cuenta que con el fin de utilizar <util:properties/>, debe declarar la ubicación util espacio de nombres y esquema en el preámbulo en la parte superior de su archivo de configuración XML de primavera:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:util="http://www.springframework.org/schema/util" 
     xsi:schemaLocation=" 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd"> 

<!-- <bean/> definitions here --> 

</beans> 
+1

Al mirar el esquema y la documentación en el apéndice A, aparentemente no es así. – laz

7

Su archivo beans.xml debe tener un PropertyPlaceholderConfigurer:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <list> 
      <value>classpath:some/pkg/resource.properties</value> 
     </list> 
    </property> 
    <!-- Default values for backwards compatibility --> 
    <property name="properties"> 
     <props> 
      <prop key="name">value</prop> 
     </props> 
    </property> 
</bean> 

Y entonces usted puede hacer referencia a las propiedades como tal en otras partes del beans.xml:

<bean class="${blah}"> 
    .... 
<bean> 

Para un artículo sobre esto, echa un vistazo a http://almaer.com/blog/spring-propertyplaceholderconfigurer-a-nice-clean-way-to-share

+0

a diferencia de los métodos a los que me refiero en mi pregunta, la función '', y la clase 'PropertiesFactoryBean', el' PropertyPlaceholderConfigurer' el enfoque no hace que las propiedades sean visibles fuera del contexto. –

1

Utilizamos esto:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/> 
    <property name="locations"> 
     <value>classpath:test.properties</value> 
    </property> 
</bean> 

que permite a la propiedades que se definen para ser utilizados como referencias en los archivos de configuración

Para más información ver:

http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/beans/factory/config/PropertyPlaceholderConfigurer.html

+0

A diferencia de los métodos a los que me refiero en mi pregunta, la función '', y la clase 'PropertiesFactoryBean', el enfoque' PropertyPlaceholderConfigurer' no hace que las propiedades sean visibles fuera del contexto. –

2

Hay esta cosa llamada PropertyPlaceholderConfigurer, puede utilizarlo para inyecte sus beans con los valores de un archivo de propiedades, como este:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <value>classpath:com/foo/jdbc.properties</value> 
    </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> 
+0

A diferencia de los métodos a los que me refiero en mi pregunta, la función '', y la clase 'PropertiesFactoryBean', el enfoque' PropertyPlaceholderConfigurer' no hace que las propiedades sean visibles fuera del contexto. –

5

Para ejemplo a través del PropertiesFactoryBean. Use PropertyPlaceholderConfigurer para configurar beans en el contexto mediante propiedades.

En las otras respuestas, encontrará ejemplos de PropertyPlaceholderConfigurer. Aquí está un ejemplo PropertiesFactoryBean:

<bean id="properties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
    <property name="location" value=classpath:config/applicationConfig.properties"/> 
</bean> 
+0

Su respuesta fue la única en mencionar tanto 'PropertiesFactoryBean' como' PropertyPlaceholderConfigurer'. ¿Te importaría ampliar las diferencias entre estas dos clases? –

+5

Si desea inyectar una instancia de Propiedades como un bean, utilice PropertiesFactoryBean. Utilice PropertyPlaceholderConfigurer si desea parametrizar otros beans en función de los valores de un archivo de propiedades. Creo que ProperiesFactoryBean es lo que necesitas aquí. –

+0

esta es una distinción sutil, pero muy importante. –

1

Si desea hacer referencia al objeto como una instancia de java.util.Properties, usted debe hacer lo siguiente:

<bean id="properties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
    <property name="ignoreResourceNotFound"><value>true</value></property> 
    <property name="locations"> 
     <list> 
      <value>classpath:property-file.properties</value> 
     </list> 
    </property> 
</bean> 

Esto le permite hacer referencia al grano de primavera properties como una instancia de java.util.Properties. Incluso puede hacer que combine varios archivos de propiedades agregando más valores a location. Consulte esta descripción de resource strings para obtener información sobre los tipos de valores que Spring aceptará para la ubicación. Si desea utilizar sustituciones de estilo ${} en Spring XML, puede ver que hay otras respuestas que describen cómo hacerlo.

+0

Esta solución está más cerca de los métodos a los que me refiero en mi pregunta y se comporta de forma similar a la función ''. –

Cuestiones relacionadas