Tengo un montón de frijoles Spring que se recogen del classpath a través de anotaciones, por ejemplo
@Repository("personDao")
public class PersonDaoImpl extends AbstractDaoImpl implements PersonDao {
// Implementation omitted
}
En el archivo Spring XML, hay un PropertyPlaceholderConfigurer definido:
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="/WEB-INF/app.properties" />
</bean>
Quiero inyectar una de las propiedades de app.properites en el bean que se muestra arriba. No puedo simplemente hacer algo como
<bean class="com.example.PersonDaoImpl">
<property name="maxResults" value="${results.max}"/>
</bean>
Debido a que PersonDaoImpl no aparece en el archivo Spring XML (se recoge del classpath a través de anotaciones). Llegué a lo siguiente:
@Repository("personDao")
public class PersonDaoImpl extends AbstractDaoImpl implements PersonDao {
@Resource(name = "propertyConfigurer")
protected void setProperties(PropertyPlaceholderConfigurer ppc) {
// Now how do I access results.max?
}
}
¿Pero no tengo claro cómo accedo a la propiedad que me interesa ppc
?
java
spring
dependency-injection
Dónal
fuente
fuente
PropertyPlaceholderConfigurer
ya no es la clase recomendada. Prefiero en suPropertySourcesPlaceholderConfigurer
lugar. En cualquier caso, puede usar la definición XML más corta<context:property-placeholder />
.Respuestas:
Puedes hacer esto en Spring 3 usando el soporte EL. Ejemplo:
systemProperties
es un objeto implícito ystrategyBean
es un nombre de bean.Un ejemplo más, que funciona cuando quieres tomar una propiedad de un
Properties
objeto. También muestra que puede aplicar@Value
a los campos:Aquí hay una publicación de blog que escribí sobre esto para obtener un poco más de información.
fuente
systemProperties
simplementeSystem.getProperties()
? Supongo que si quiero inyectar mis propias propiedades en un Spring Bean, necesito definir un<bean id="appProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
valor de lectura de eso en otro Bean usando algo como@Value("#{appProperties.databaseName}")
Personalmente, me encanta esta nueva forma en Spring 3.0 de los documentos :
¡Sin captadores ni colocadores!
Con las propiedades que se cargan a través de la configuración:
Para aumentar mi alegría, incluso puedo controlar hacer clic en la expresión EL en IntelliJ y me lleva a la definición de la propiedad.
También existe la versión totalmente no xml :
fuente
Hay una nueva anotación
@Value
en Spring 3.0.0M3 .@Value
no solo admite#{...}
expresiones, sino también${...}
marcadores de posiciónfuente
<context:property-placeholder ... />
es el equivalente XML al PropertyPlaceholderConfigurer.Ejemplo: applicationContext.xml
Clase de componentes
fuente
<context:component-scan base-package="com.company.package" />
Para referencia, estoy usando spring a través deApplicationContext
, no en un contexto web.Otra alternativa es agregar el bean appProperties que se muestra a continuación:
Cuando se recupera, este bean se puede convertir en un
java.util.Properties
que contendrá una propiedadresults.max
cuyo valor se leeapp.properties
. Nuevamente, este bean se puede inyectar dependencia (como una instancia de java.util.Properties) en cualquier clase a través de la anotación @Resource.Personalmente, prefiero esta solución (a la otra que propuse), ya que puede limitar exactamente qué propiedades están expuestas por appProperties y no es necesario leer app.properties dos veces.
fuente
Necesito tener dos archivos de propiedades, uno para producción y una anulación para desarrollo (que no se implementará).
Para tener ambos, un bean de propiedades que se puede conectar automáticamente y un PropertyConfigurer, puede escribir:
y haga referencia al bean de propiedades en el PropertyConfigurer
fuente
Antes de obtener Spring 3, que le permite inyectar constantes de propiedad directamente en sus beans mediante anotaciones, escribí una subclase del bean PropertyPlaceholderConfigurer que hace lo mismo. Por lo tanto, puede marcar sus establecedores de propiedades y Spring conectará automáticamente sus propiedades a sus beans de la siguiente manera:
La anotación es la siguiente:
El PropertyAnnotationAndPlaceholderConfigurer es el siguiente:
Siéntase libre de modificar al gusto
fuente
También puedes anotar tu clase:
Y tener una variable como esta:
Ahora puede acceder a todas sus propiedades de esta manera:
fuente
Camino de primavera:
private @Value("${propertyName}") String propertyField;
es una nueva forma de inyectar el valor utilizando la clase "PropertyPlaceholderConfigurer" de Spring. Otra forma es llamar
Nota: Para @Value, no puede usar static propertyField, debe ser no estático solamente, de lo contrario, devuelve nulo. Para solucionarlo, se crea un setter no estático para el campo estático y @Value se aplica por encima de ese setter.
fuente
Como se mencionó
@Value
hace el trabajo y es bastante flexible, ya que puede tener Spring EL en él.Aquí hay algunos ejemplos que podrían ser útiles:
Otro para obtener un
set
de unlist
También puede establecer valores para tipos primitivos.
Puedes llamar a métodos estáticos:
Puedes tener lógica
fuente
Una posible solución es declarar un segundo bean que lee del mismo archivo de propiedades:
El bean llamado 'appProperties' es del tipo java.util.Properties y se puede inyectar dependencia usando el atributo @Resource que se muestra arriba.
fuente
Si está atascado con Spring 2.5, puede definir un bean para cada una de sus propiedades e inyectarlas con calificadores. Me gusta esto:
y
No es súper legible pero hace el trabajo.
fuente
Autoconexión de valores de propiedad en frijoles de primavera:
La mayoría de la gente sabe que puede usar @Autowired para decirle a Spring que inyecte un objeto en otro cuando carga el contexto de su aplicación. Una pepita de información menos conocida es que también puede usar la anotación @Value para inyectar valores de un archivo de propiedades en los atributos de un bean. mira esta publicación para más información ...
cosas nuevas en Spring 3.0 || valores de bean de cableado automático || valores de propiedad de autoconexión en primavera
fuente
Para mí, fue la respuesta de @ Lucky, y específicamente, la línea
de la página Capitán Depuración
Eso solucionó mi problema. Tengo una aplicación basada en ApplicationContext que se ejecuta desde la línea de comandos y, a juzgar por una serie de comentarios sobre SO, Spring los conecta de manera diferente a las aplicaciones basadas en MVC.
fuente
Creo que la forma más conveniente de inyectar propiedades en el bean es el método setter.
Ejemplo:
Definición xml de frijol:
Por cada
property
método nombradosetProperty(value)
se invocará.De esta manera es especialmente útil si necesita más de un bean basado en una implementación.
Por ejemplo, si definimos un bean más en xml:
Entonces código como este:
Imprimirá
Entonces, en su caso, debería verse así:
fuente
Si necesita más flexibilidad para las configuraciones, pruebe el Settings4jPlaceholderConfigurer: http://settings4j.sourceforge.net/currentrelease/configSpringPlaceholder.html
En nuestra aplicación utilizamos:
El orden predeterminado en el que se verifica primero la fuente-valor-clave se describe en:
http://settings4j.sourceforge.net/currentrelease/configDefault.html
Se puede personalizar con un settings4j.xml (preciso para log4j.xml) en su classpath
Déjame saber tu opinión: [email protected]
con saludos amistosos,
Harald
fuente
Utilice la clase "PropertyPlaceholderConfigurer" de Spring
Un ejemplo simple que muestra el archivo de propiedades leído dinámicamente como propiedad del bean
Archivo de propiedades
dev.app.jdbc.driver = com.mysql.jdbc.Driver
dev.app.jdbc.url = jdbc: mysql: // localhost: 3306 / addvertisement
dev.app.jdbc.username = root
dev.app.jdbc.password = root
fuente