2012-05-30 23 views
27

Si tengo:¿Cómo obtengo un valor de propiedad de un objeto ApplicationContext? (Sin utilizar una anotación)

@Autowired private ApplicationContext ctx; 

puedo conseguir los frijoles y los recursos mediante el uso de uno de los métodos de las getBean. Sin embargo, no puedo entender cómo obtener los valores de las propiedades.

Obviamente, puedo crear un nuevo bean que tiene una propiedad @Valor como:

private @Value("${someProp}") String somePropValue; 

¿Qué método debo llamar en el objeto Application Context para conseguir ese valor sin Autowiring un grano?

Normalmente utilizo @Value, pero hay una situación en la que la expresión SPeL debe ser dinámica, por lo que no puedo usar una anotación.

+0

(YourBeanType) ctx.getBean ("beanId"); –

Respuesta

11

Suponiendo que la propiedad ${someProp} proviene de un PropertyPlaceHolderConfigurer, eso dificulta las cosas. PropertyPlaceholderConfigurer es un BeanFactoryPostProcessor y, como tal, solo está disponible en el momento del inicio del contenedor. Entonces las propiedades no están disponibles para un bean en tiempo de ejecución.

Una solución sería crear algún tipo de bean titular de valor que inicie con la propiedad/propiedades que necesita.

@Component 
public class PropertyHolder{ 

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

    // + getter methods 
} 

Ahora inyectar este PropertyHolder siempre que se necesite las propiedades y acceder a las propiedades a través de los métodos getter

+0

Un ejemplo sería muy útil aquí. – Webnet

+0

@Webnet ok, agregó un pequeño ejemplo –

+0

¿No requiere esto que 'PropertyHolder' sea un bean administrado? Creo que @HappyEngineer estaba buscando una solución que no sea un frijol administrado (como yo). – Webnet

33

En el caso en el que la expresión SPEL debe ser dinámico, obtener el valor de la propiedad manualmente:

somePropValue = ctx.getEnvironment().getProperty("someProp"); 
+2

El uso de Environment en runtime (como apposed to startup) es una mala idea, ya que pasa por JNDI y otras ubicaciones que buscan el valor, que es caro – kaqqao

8

Si usted está atascado en la primavera pre 3.1, puede utilizar

somePropValue = ctx.getBeanFactory().resolveEmbeddedValue("${someProp}"); 
Cuestiones relacionadas