J'ai un tas de haricots de printemps qui sont récupérés dans le chemin de classe via des annotations, par exemple
@Repository("personDao")
public class PersonDaoImpl extends AbstractDaoImpl implements PersonDao {
// Implementation omitted
}
Dans le fichier XML Spring, un PropertyPlaceholderConfigurer est défini:
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="/WEB-INF/app.properties" />
</bean>
Je souhaite injecter l'une des propriétés de app.properites dans le bean illustré ci-dessus. Je ne peux pas simplement faire quelque chose comme
<bean class="com.example.PersonDaoImpl">
<property name="maxResults" value="${results.max}"/>
</bean>
Parce que PersonDaoImpl ne figure pas dans le fichier XML Spring (il est récupéré dans le chemin de classe via des annotations). J'ai autant que ce qui suit:
@Repository("personDao")
public class PersonDaoImpl extends AbstractDaoImpl implements PersonDao {
@Resource(name = "propertyConfigurer")
protected void setProperties(PropertyPlaceholderConfigurer ppc) {
// Now how do I access results.max?
}
}
Mais je ne sais pas comment j'accède à la propriété qui m'intéresse ppc
?
PropertyPlaceholderConfigurer
n'est plus la classe recommandée. PréférezPropertySourcesPlaceholderConfigurer
plutôt. Dans tous les cas, vous pouvez utiliser la définition XML plus courte<context:property-placeholder />
.Réponses:
Vous pouvez le faire au printemps 3 en utilisant le support EL. Exemple:
systemProperties
est un objet implicite etstrategyBean
est un nom de bean.Un autre exemple, qui fonctionne lorsque vous souhaitez récupérer une propriété d'un
Properties
objet. Il montre également que vous pouvez appliquer@Value
aux champs:Voici un article de blog que j'ai écrit à ce sujet pour un peu plus d'informations.
la source
systemProperties
simplementSystem.getProperties()
? Je suppose que si je veux injecter mes propres propriétés dans un bean Spring, je dois définir une valeur<bean id="appProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
puis la lire dans un autre bean en utilisant quelque chose comme@Value("#{appProperties.databaseName}")
Personnellement, j'aime cette nouvelle façon dans Spring 3.0 de la documentation :
Pas de getters ni de setters!
Avec les propriétés chargées via la configuration:
Pour poursuivre ma joie, je peux même contrôler le clic sur l'expression EL dans IntelliJ et cela m'amène à la définition de la propriété!
Il y a aussi la version totalement non xml :
la source
Il existe une nouvelle annotation
@Value
dans Spring 3.0.0M3 .@Value
prendre en charge non seulement les#{...}
expressions mais${...}
aussi les espaces réservésla source
<context:property-placeholder ... />
est l'équivalent XML de PropertyPlaceholderConfigurer.Exemple: applicationContext.xml
Classe de composants
la source
<context:component-scan base-package="com.company.package" />
Pour référence, j'utilise le ressort via leApplicationContext
, pas dans un contexte Web.Une autre alternative consiste à ajouter le bean appProperties illustré ci-dessous:
Une fois récupéré, ce bean peut être converti en un
java.util.Properties
qui contiendra une propriété nomméeresults.max
dont la valeur est lue dansapp.properties
. Encore une fois, ce bean peut être injecté en dépendance (comme une instance de java.util.Properties) dans n'importe quelle classe via l'annotation @Resource.Personnellement, je préfère cette solution (à l'autre que j'ai proposée), car vous pouvez limiter exactement les propriétés exposées par appProperties et n'avez pas besoin de lire app.properties deux fois.
la source
J'ai besoin d'avoir deux fichiers de propriétés, un pour la production et un remplacement pour le développement (qui ne sera pas déployé).
Pour avoir les deux, un bean de propriétés qui peut être câblé automatiquement et un PropertyConfigurer, vous pouvez écrire:
et référencer le bean de propriétés dans le PropertyConfigurer
la source
Avant d'obtenir Spring 3 - qui vous permet d'injecter des constantes de propriété directement dans vos beans à l'aide d'annotations - j'ai écrit une sous-classe du bean PropertyPlaceholderConfigurer qui fait la même chose. Ainsi, vous pouvez annoter vos setters de propriétés et Spring câblera automatiquement vos propriétés dans vos beans comme ceci:
L'annotation est la suivante:
Le PropertyAnnotationAndPlaceholderConfigurer est le suivant:
N'hésitez pas à modifier au goût
la source
Vous pouvez également annoter votre classe:
Et avoir une variable comme celle-ci:
Vous pouvez maintenant accéder à toutes vos propriétés de cette manière:
la source
Manière de ressort:
private @Value("${propertyName}") String propertyField;
est une nouvelle façon d'injecter la valeur en utilisant la classe "PropertyPlaceholderConfigurer" de Spring. Une autre façon est d'appeler
Remarque: Pour @Value, vous ne pouvez pas utiliser static propertyField, il doit être non statique uniquement, sinon il renvoie null. Pour y remédier, un setter non statique est créé pour le champ statique et @Value est appliqué au-dessus de ce setter.
la source
Comme mentionné,
@Value
le travail est fait et il est assez flexible car vous pouvez y avoir un ressort EL.Voici quelques exemples qui pourraient être utiles:
Un autre pour obtenir
set
unlist
Vous pouvez également définir des valeurs pour les types primitifs.
Vous pouvez appeler des méthodes statiques:
Vous pouvez avoir de la logique
la source
Une solution possible consiste à déclarer un second bean qui lit à partir du même fichier de propriétés:
Le bean nommé 'appProperties' est de type java.util.Properties et peut être injecté en dépendance à l'aide de l'attruibute @Resource illustré ci-dessus.
la source
Si vous êtes bloqué avec Spring 2.5, vous pouvez définir un bean pour chacune de vos propriétés et les injecter à l'aide de qualificatifs. Comme ça:
et
Ce n'est pas super lisible mais il fait le travail.
la source
Auto-câblage des valeurs de propriété dans Spring Beans:
La plupart des gens savent que vous pouvez utiliser @Autowired pour dire à Spring d'injecter un objet dans un autre lorsqu'il charge votre contexte d'application. Une pépite d'informations moins connue est que vous pouvez également utiliser l'annotation @Value pour injecter des valeurs d'un fichier de propriétés dans les attributs d'un bean. voir cet article pour plus d'informations ...
nouveaux trucs au printemps 3.0 || valeurs du bean à câblage automatique || valeurs des propriétés de câblage automatique au printemps
la source
Pour moi, c'était la réponse de @ Lucky, et plus précisément, la ligne
depuis la page Captain Debug
qui a résolu mon problème. J'ai une application basée sur ApplicationContext exécutée à partir de la ligne de commande, et à en juger par un certain nombre de commentaires sur SO, Spring les relie différemment aux applications basées sur MVC.
la source
Je pense que c'est le moyen le plus pratique pour injecter des propriétés dans le bean est la méthode setter.
Exemple:
Définition XML du bean:
Pour chaque
property
méthode nomméesetProperty(value)
sera invoquée.Cette méthode est particulièrement utile si vous avez besoin de plus d'un bean basé sur une implémentation.
Par exemple, si nous définissons un bean de plus en xml:
Ensuite, codez comme ceci:
Imprime
Donc, dans votre cas, cela devrait ressembler à ceci:
la source
Si vous avez besoin de plus de flexibilité pour les configurations, essayez le Settings4jPlaceholderConfigurer: http://settings4j.sourceforge.net/currentrelease/configSpringPlaceholder.html
Dans notre application, nous utilisons:
L'ordre par défaut, dont la valeur-clé-Source est vérifiée en premier, est décrit dans:
http://settings4j.sourceforge.net/currentrelease/configDefault.html
Il peut être personnalisé avec un settings4j.xml (précis pour log4j.xml) dans votre chemin de classe.
Faites-moi savoir votre opinion: [email protected]
Cordialement,
Harald
la source
Utilisez la classe "PropertyPlaceholderConfigurer" de Spring
Un exemple simple montrant un fichier de propriétés lu dynamiquement comme la propriété du bean
Fichier de propriétés
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
la source