2011-05-09 22 views
10

Tengo un archivo de propiedades con muchos valores y no quiero enumerarlos en mi archivo de configuración de beans por separado. Por ejemplo:Cómo inyectar el archivo de propiedades completo en un springbean

<property name="foo"> 
    <value>${foo}</value> 
</property> 
<property name="bar"> 
    <value>${bar}</value> 
</property> 

y así sucesivamente.

Imagino inyectar todo completamente como java.util.Properties o menos como java.util.Map. ¿Hay alguna manera de hacerlo?

Respuesta

13

Sí, puede usar <util:properties> para cargar un archivo de propiedades y declarar el objeto resultante java.util.Properties como un bean. Luego puede inyectar eso como lo haría con cualquier otra propiedad de frijol.

Ver section C.2.2.3 of the Spring manual, y su ejemplo:

<util:properties id="myProps" location="classpath:com/foo/jdbc-production.properties" 

Recuerde que declarar el espacio de nombres util: según these instructions.

+0

Voy a intentar esto - ¡Gracias! – Jan

+4

cómo acceder a él en el código? – Sridhar

2

Es posible con la PropertyOverrideConfigurer mecanismo: el archivo

<context:property-override location="classpath:override.properties"/> 

Propiedades:

beanname1.foo=foovalue 
beanname2.bar.baz=bazvalue 

El mecanismo se explica en la sección 3.8.2.2 Example: the PropertyOverrideConfigurer

+0

gracias por su respuesta - mi culpa, el archivo de propiedades será editado por un "no desarrollador" y será "fácil de leer" para el editor sin antecedentes especiales. Por lo tanto, los nombres de los frijoles no serían la forma correcta de usarlos como clave. – Jan

11

Para Java Config, utilice PropertiesFactoryBean:

@Bean 
public Properties myProperties() { 
    PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean(); 
    propertiesFactoryBean.setLocation(new ClassPathResource("/myProperties.properties")); 
    Properties properties = null; 
    try { 
     propertiesFactoryBean.afterPropertiesSet(); 
     properties = propertiesFactoryBean.getObject(); 

    } catch (IOException e) { 
     log.warn("Cannot load properties file."); 
    } 
    return properties; 
} 

Y luego, establezca las propiedades del objeto:

@Bean 
public AnotherBean myBean() { 
    AnotherBean myBean = new AnotherBean(); 
    ... 

    myBean.setProperties(myProperties()); 

    ... 
} 

Esperanza esto ayuda para los interesados ​​en forma de Java Config.

+0

Wow, eso es un montón de código. ¿No hay una manera más fácil como la configuración XML 1-liner ''? – rustyx

+0

@rustyx ¡oh! No encontré en ese momento otra forma de hacerlo, pero [yours] (http://stackoverflow.com/a/31193653/787375) es muy agradable. :) – jelies

14

Para configuración de Java se puede usar algo como esto:

@Autowired @Qualifier("myProperties") 
private Properties myProps; 

@Bean(name="myProperties") 
public Properties getMyProperties() throws IOException { 
    return PropertiesLoaderUtils.loadProperties(
     new ClassPathResource("/myProperties.properties")); 
} 

También puede tener varias propiedades de esta manera, si se asigna un nombre único frijol (Qualifier) para cada instancia.

Cuestiones relacionadas