Spring Util: Inyección de propiedades a través de anotaciones en un bean

Si tengo 2 archivos .properties configurados en mi Spring XML así:

<util:properties id="serverProperties" location="file:./applications/MyApplication/server.properties"/>
<util:properties id="someConfig" location="file:./applications/MyApplication/config.properties"/>

¿Cómo puedo inyectar a través de anotaciones estos archivos de propiedades en un bean con java.util.Properties?

¿Cómo puedo obtener propiedades específicas a través de las anotaciones de Spring?

¡Aclamaciones!

preguntado el 28 de agosto de 11 a las 04:08

5 Respuestas

@Autowired
@Qualifier("serverProperties")
private Properties serverProperties;
@Autowired
@Qualifier("someConfig")
private Properties otherProperties;

or

@Resource(name = "serverProperties")
private Properties serverProperties;
@Resource(name = "someConfig")
private Properties otherProperties;

Por lo general, @Autowired se usa para el cableado automático por tipo en Spring, y @Resource se usa para el nombre. @ Autowired + @ Qualifier puede funcionar como cableado automático por nombre, pero en realidad está diseñado para cableado automático por tipo con la capacidad de afina el tipo.

Respondido el 01 de junio de 12 a las 01:06

Como esta pregunta tiene muchos aciertos. Pensé que valdría la pena señalar otra opción usando SpEL (Spring Expression Language): si necesita propiedades específicas, pueden inyectarse usando la anotación @Value en propiedades específicas del bean;

class SomeClass {
   @Value("#{serverProperties['com.svr.prop']}")
   private String aServerCfgProperty;

   @Value("#{someConfig['another.config.setting']}")
   private String someOtherProperty;
}

No es necesario utilizar la sintaxis de indexación ['index.val'] puede obtenerlo directamente;

@Value("#{someConfig}")
private Properties someConfig

@Value("#{serverProperties}")
private Properties svrProps;

Encontré esto bastante útil y me alejé de usar el objeto de propiedades inyectado directamente a través de @ Resource / @ Autowired.

Otra buena razón para usar el @Value con un objeto de propiedades indexado es que algunos IDE (por ejemplo, IntelliJ) pueden refactorizar los nombres de propiedad reales si también tiene el archivo .properties en el proyecto, lo cual es bueno. Otro consejo es usar algo como EProperties (que extiende el objeto de propiedades de Java nativo) si desea hacer inclusión / anidación / sustitución en archivos de propiedades sin usar Spring's PropertiesPlaceholderConfigurer clase (que lamentablemente no expone sus propiedades, para usar la indexación SpEL ['key'] el frijol debe ser una instancia de Map<> es decir, extender el mapa que hace el objeto Propiedades de Java) ...

Finalmente, otra característica interesante de SpEL es que puede acceder a las propiedades de los frijoles directamente. Así que di, por ejemplo, si SomeClass en el ejemplo anterior era un frijol Spring, por ejemplo someClass luego en AnotherBeanClass podríamos tener;

@Value("#{someClass.someOtherProperty}")
private String injectedBeanProp

También puede llamar a un método getter:

@Value("#{someClass.getSomeOtherProperty()}")
private String injectedBeanProp

Consulte la guía SpEL aquí; http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#expressions

Respondido el 22 de enero de 15 a las 16:01

Solo una nota que SpEL está en Spring 3+ - Lobo de noche

Significa que tiene un problema con la expresión del hechizo o que el bean no está conectado. Publique una pregunta y agregue un enlace aquí - Lobo de noche

Puede utilizar @PropertySource

@Configuration
@PropertySource(name = "someName", value = {"classpath:a.properties", "classpath:b.properties"})
public class MyConfiguration {
}

Respondido 02 Jul 12, 00:07

Esto es bueno, elimina por completo la necesidad de configuración XML. - codificador azul

¿Y cómo inyecto entonces las propiedades cargadas? - Kareem Jeiroudi

Archivo XMl

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:mvc="http://www.springframework.org/schema/mvc"
 xmlns:util="http://www.springframework.org/schema/util"
 xsi:schemaLocation="
 http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context-4.0.xsd
 http://www.springframework.org/schema/mvc
 http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
 http://www.springframework.org/schema/util 
 http://www.springframework.org/schema/util/spring-util-4.0.xsd">
    <context:component-scan base-package="com.sha.home" />
    <mvc:annotation-driven/>
    <util:properties id="dbProp" location="classpath:db.properties" />
    <!-- <context:property-placeholder location="classpath:db.properties"/> -->

</beans>

en el archivo java @Value ("# {dbProp}") propiedades privadas dbProperties;

System.out.println ("urllll" + dbProperties.getProperty ("jdbc.url"));

Respondido el 04 de enero de 17 a las 06:01

La mayoría de las veces encapsulo todas las propiedades en una sola utilidad y las uso en mis aplicaciones. De esa manera, no necesita preocuparse / administrar cada archivo de propiedades en la capa de la aplicación. Autowired setProps (...) lee todo lo que cargó util: propiedades en el accesorios lista.

import java.util.List;
import java.util.Properties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class AppProperiesProcessor {

private List<Properties> props;
private Properties mergedProperties;

@Autowired
public final void setProps(List<Properties> props) {
    this.props = props;
}

public String getProp(final String keyVal) {

    if (null == this.mergedProperties) {
        this.mergedProperties = new Properties();

        for (Properties prop : this.props) {
            this.mergedProperties.putAll(prop);
        }
    }
    return mergedProperties.getProperty(keyVal);
  } 
}

respondido 24 mar '14, 23:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.