Quelle est la meilleure stratégie pour le chargement des propriétés?
J'ai plusieurs classes qui ont besoin de charger des fichiers de propriétés, et je me demandais quelles sont les meilleures pratiques pour accomplir cette tâche. J'ai pensé à deux approches de base:
- Coder en dur les propriétés de nom de fichier dans chaque classe, et ensuite utiliser le
Properties
de la classe à charger à partir d'unFileInputStream
, ce qui peut être problématique si quelqu'un décide de changer le nom du fichier de propriétés, comme c'est codé en dur dans le code.
public class A { public A() { Properties p = new Properties().load( new FileInputStream("properties/Aconfig.properties")); String value = p.getProperty("key", ""); } }
- Créer une méthode qui, étant donné un nom de classe, charge un fichier de propriétés qui a le même nom que la classe. Bien que cette approche n'a pas besoin de coder en dur les propriétés de nom de fichier, il ne nécessite que nous suivons certains convention de nommage des fichiers, ce qui peut entraîner de la confusion.
public class A { public A() { Properties p = PropertiesHelper.loadFromClassName(A.class.getName()); //here, we **assume** that there is a A.properties file in the classpath. } }
Cependant, il peut y avoir beaucoup d'autres plus élégant approches, et c'est pourquoi j'ai posé ces questions: i) Quelles sont les meilleures pratiques pour le chargement des fichiers de propriétés en Java?; ii) utilisez-vous toute la classe helper qui prend soin de l'emploi?; iii) Où (dans le code) faites-vous généralement de charger le fichier de propriétés?
Aussi, est-il OK pour une classe de "chargement automatique" ses propriétés? Ou dois-je passer les arguments que j'ai besoin pour le constructeur ? Le problème du passage des arguments, c'est qu'il y a beaucoup trop pour certaines classes (~20, qui représentent des paramètres dans un modèle statistique).
OriginalL'auteur João Silva | 2009-08-04
Vous devez vous connecter pour publier un commentaire.
La meilleur pratique serait d'utiliser une sorte de l'injection de dépendance conteneur - par exemple Spring Framework ou Google Guice.
Il résout toutes sortes de problèmes - vous n'attachez pas votre classe à la propriété particulière de nom de fichier, vous n'avez pas à vous soucier de chargement de ces propriétés au sein de cette classe et de gérer les exceptions possibles, et vous n'avez pas à passer 30 propriété des noms de fichiers comme arguments de ligne de commande (ou les propriétés du système).
Il aide aussi à avec beaucoup, beaucoup d'autres choses, en plus des biens de chargement 🙂 - essayez-le, et vous vous demanderez comment vous avez pu vivre sans.
Mise à jour: d'ailleurs, votre autre question est aussi une de ces choses que le Printemps serait de prendre soin de.
Mise à jour #2: je viens de réaliser que j'ai déjà essayé de pousser le Printemps sur vous 🙂 Au risque de me répéter, le Printemps serait vraiment aider avec l'abstraction ici. En fonction de ce que vous stockez dans votre propriété fichiers que vous ne pouvez pas besoin d'eux (si ils traitent de configuration) ou vous obtiendrez une très bonne API pour traiter avec eux (si ils sont des offres de ressources ou quelque chose de similaire) .
Vous pouvez encore très bien le faire. Le printemps est une très belle ressource de la couche d'abstraction: static.springsource.org/spring/docs/2.5.x/reference/... qui vous permettrait de traiter ces fichiers de propriété "comme est" sans monopoliser vos classes à eux directement.
Hmm, je vais lire à ce sujet, merci. Je pensais que vous faisiez référence à la <propriété> élément à l'intérieur <bean>. Quant à votre question, je n'ai pas stocker de nombreux paramètres du modèle (par exemple, numberOfTrials=50, et cetera [valeurs numériques]).
<property>
élément est l'endroit où vous placez votre fichier de propriétés de nom; puis à l'intérieur de votre classe, vous aurez un setter correspondant prendre Ressource en tant que paramètre. Aussi loin que les paramètres du modèle à aller, ceux qui peuvent ou peuvent ne pas être de bons candidats pour la configuration via<property>
- cela dépend si ils ont des "valeurs par défaut" ou c'est quelque chose que les utilisateurs doivent spécifier. Vous voudrez peut-être chercher à PropertyPlaceholderConfigurer ou PropertyOverrideConfigurer: static.springsource.org/spring/docs/2.5.x/reference/beans.html qui servent de pont entre les propriétés des fichiers et des<property>
définir à partir du contexteOriginalL'auteur ChssPly76
Ont à plusieurs endroits pour l'un des fichiers de propriétés et de les charger (l'un après l'autre) en un seul Propriétés de l'objet. Ce système permettra une cartographie d'avoir une valeur par défaut qui peut ensuite être substituée à plusieurs points.
OriginalL'auteur Itay Maman
Les noms de fichiers peuvent facilement être passé dans la ligne de commande pour l'application. Cela peut être fait soit comme un arg à la méthode main (d'après le nom de la classe principale) ou comme une propriété (comme aperkins fait allusion, je crois) à l'aide de la Drapeau-D.
Si vous codés en dur vos noms de fichiers, vous être dans un poste similaire. Vous pouvez avoir un nom de fichier sur la ligne de commande qui contient une liste de fichiers de configuration que vous avez besoin.
OriginalL'auteur akf
Dans le passé, j'ai chargé les propriétés par le biais d'un système de propriété - le nom de fichier est passée par le biais du système de la propriété, et je charge le fichier. Il y a un nom par défaut que nous utilisons, si le système de propriété n'est pas définie. Si le fichier n'existe pas, alors vous devez décider quoi faire.
La bonne chose à propos de ce qui est là est un standard, mais ils peuvent remplacer c'est l'endroit/nom à l'aide d'un argument de ligne de commande.
Juste mes 2 cents.
OriginalL'auteur aperkins
Je suggère d'éviter l'utilisation des Fichiers et du système de fichiers liés à des chemins. Il est généralement préférable d'utiliser classpath chemins (hmm, pas de jeu de mots...) parce que:
- il rend votre code testable en séparant les chargeurs de classes entre le moment de l'exécution et le temps de test, quelque chose qui est habituellement fait par n'importe quel décent système de construction
- il rend votre code d'emplacement indépendant et vous permet d'ignorer des questions sur l'OS
- il rend votre code fonctionne de la même comme une application autonome ou au sein d'un conteneur (léger, servlet, serveur d'application, quoi que...)
Vous pouvez avoir un coup d'oeil à la PropertyResourceBundle qui a les plus belles supplémentaires en fonction des paramètres Régionaux conscient, de sorte que vous pouvez définir des propriétés différentes avec des paramètres Régionaux différents. Notez que les paramètres Régionaux peuvent être utilisés pour fournir de paramétrage, indépendamment de la l10n ou i18n questions, par exemple. Je l'ai utilisé sur un projet de "windows" et "linux" locale, parce que vous pouvez construire votre propre Locale de l'instance et de le transmettre au chargeur.
Ou vous pouvez simplement construire le chemin de vous-même...
Ou vous pouvez charger vos Propriétés à partir d'un flux d'entrée:
HTH.
J'ai probablement négligé votre question et vous a donné une mauvaise réponse. Ce que j'ai déjà fait dans votre cas particulier, est d'accueillir les propriétés pour être chargé dans une racine du fichier de propriétés. De toute façon, cette information doit être stockée quelque part: codé en dur dans votre code, ou dans un fichier de configuration. Mieux utiliser le même mécanisme pour tout... Cependant, si vos propriétés sont liées à la classe de nom, vous feriez mieux d'utiliser votre deuxième solution mais stocker vos propriétés pour faciliter le montage à l'extérieur de votre source principale de l'arbre et les ajouter dans le classpath lors de l'exécution.
OriginalL'auteur insitu