2011-06-21 25 views
12

Estoy tratando de cargar un archivo de propiedades en un Spring Bean y luego inyectar ese bean en una clase.Inyectando propiedades usando Spring & anotación @Value

La única parte que no puedo encontrar parece estar usando la referencia @Resource.¿Puede alguien conectar la última pieza por mí? Obtengo un valor nulo cada vez. No parece querer inyectar el valor.

[EDIT] - Originalmente pensé que usar @Resource era la mejor manera, pero la solución propuesta me resultó más fácil.

vi esta solución en otro post:

Referencia Solución Enlace:Inject Property Value into Spring - posted by DON

crédito a Don para el puesto, pero yo no estaba seguro de cómo terminar con el @Resource .

Resultados

de depuración: el valor de variable appProperties siempre es nula. No está siendo inyectado.

Spring Config. enter image description here

de clase de ejemplo:

package test; 

import java.util.Properties; 
import javax.annotation.Resource; 


public class foo { 
    public foo() {} 
    @Resource private java.util.Properties appProperties; 
} 

Basándose en el asesoramiento en la solución aprobado continuación. Aquí están los cambios que hice.


Solución Actualización:

primavera Config: enter image description here

Java Class: enter image description here

+0

lo que sucede cuando se intenta su solución? – skaffman

+0

private @Resource Properties es un error tipográfico? ¿Has probado @Resource Private Properties? No estoy seguro de que no funcione así. Nunca vi la anotación antes del modificador. – abalogh

+0

@Skaffman: obtengo un valor nulo. El valor de la variable no está encuadernado ni inyectado. – haju

Respuesta

17

Para su solución funcione, también tendría que hacer un foo gestionados Spring de frijol; porque de lo contrario, ¿cómo sabría Spring que tiene que tratar con alguna de tus anotaciones en tu clase?

  • Puede especificar en su xml appcontext como un bean con ..class="foo"
  • O utilice component-scan y especificar un paquete de base que contiene su clase foo.

Ya que no estoy del todo seguro de que esto es exactamente lo que quiere (no desea que un archivo .properties a ser analizado por la primavera y tener su pares de valores clave disponibles en lugar de un objeto Properties?), Te lo que sugiere otra solución: Usando el espacio de nombres util

<util:properties id="props" location="classpath:com/foo/bar/props.properties"/> 

y de referencia los valores dentro de sus granos (también, tienen que ser gestionados de Spring):

@Value("#{props.foo}") 
public void setFoo(String foo) { 
    this.foo = foo; 
} 

EDIT:

acaba de darse cuenta de que está importando org.springframework.context.ApplicationContext en su clase, que probablemente sea innecesario. Le recomiendo encarecidamente que lea Spring reference al menos en los primeros capítulos, porque a) es una gran lectura b) le resultará mucho más fácil comprender Spring si los fundamentos son claros.

+0

Gracias, pero lo intentaré con la etiqueta haju

+0

Si elijo el primer método de implementación que no utiliza el componente @Component con el componente-scan, ¿no usaría @Value más correctamente porque tendría que inyectar en la configuración de Spring? – haju

+0

También tenga en cuenta que el valor que le da a @Value, "# {props.foo}" en el ejemplo anterior, no debe contener puntos para la propiedad KEY ("foo" en este ejemplo). Estaba migrando para usar EL desde la vieja escuela, donde mis claves dentro del archivo de propiedades tenían la forma a.b.c = xyz, etc. Y falló. Considerando que, por ejemplo, abc = xyz funcionó. – arcseldon

3

Una solución más utilizando el marcador de posición de propiedades.

El contexto de primavera:

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:context="http://www.springframework.org/schema/context" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.1.xsd"> 

    <context:component-scan base-package="your.packege" /> 

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

</beans> 

la clase Java en el que desea inyectar valores de las propiedades:

public class ClassWithInjectedProperty { 

    @Value("${props.foo}") 
    private String foo; 
} 
Cuestiones relacionadas