En ce qui concerne les valeurs telles que les informations de destination de connexion et les informations d'authentification à la base de données et au serveur externe, il est très courant de vouloir avoir des valeurs différentes pour la valeur pour le développement et la valeur pour l'opération de production. À ce moment-là, dans le même fichier de définition
conf.properties
#Destination de la connexion de production
#url=http://example.com/
#Tester la destination de la connexion
url=http://test.example.com/
Je vois parfois des gens qui écrivent comme ça et les traitent en remplaçant des commentaires, mais il y a diverses choses comme écrire une valeur constante solide du côté du code source (bien qu'il n'y ait aucune raison claire de le faire). Bien qu'elle soit bien meilleure que la malheureuse, ce n'est pas une très bonne méthode. La raison principale est que vous devez savoir de quel côté se trouve le contenu du fichier de définition actuel. Personne ne veut imaginer un accident où il a accidentellement oublié de recommander un fichier de définition et exposé ce qui était connecté à la connexion de test pour la production. S'il s'agit d'un cadre bien conçu aujourd'hui, il y en a qui répondent correctement aux demandes de ce domaine, mais cette fois je voudrais écrire un exemple qui ne dépend pas du cadre et qui ne demande pas beaucoup de temps et d'efforts. Je vais.
Configures.java
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.Properties;
/**
*Conteneur de valeur définie
*/
public class Configures {
/**Nom de la clé de propriété système*/
public static final String PropKey = "Config";
private static final Properties config = new Properties();
/**
*Initialisation
* @param filePath Chemin d'accès au fichier de définition
*/
synchronized public static void initialize(String filePath) {
try {
load(new FileInputStream(filePath));
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
}
/**
*Initialisation
* @param dans le flux vers le fichier de définition
*/
synchronized public static void initialize(InputStream in) {
load(in);
}
private static void load(InputStream in) {
try {
config.load(in);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
*Lire la valeur de la définition
* @élément clé param
* @valeur de définition de retour
*/
public static String get(Environment key) {
return get(key, null);
}
/**
*Lire la valeur de la définition
* @élément clé param
* @param defaultValue Valeur initiale
* @valeur de définition de retour
*/
public static String get(Environment key, String defaultValue) {
if (key == null) {
throw new IllegalArgumentException("Environment is null");
}
return config.getProperty(key.getPropertyKey(), defaultValue);
}
private Configures() {
}
}
Environment.java
/**
*Éléments clés du fichier de définition
*/
public enum Environment {
/**URL de destination de la connexion*/
ConnectUrl("url"),;
private final String key;
/**
*constructeur
* @param key Nom de la clé dans le fichier de définition
*/
private Environment(String key) {
this.key = key;
}
/**
*Obtenir la clé de propriété
* @retour du nom de la clé
*/
public String getPropertyKey() {
return getPropertyKey(System.getProperty(Configures.PropKey));
}
/**
*Obtenir la clé de propriété
* @paramètre nom d'environnement d'envName
* @retour du nom de la clé
*/
public String getPropertyKey(String envName) {
if (envName == null || "".equals(envName)) {
return key;
}
return String.format("%s.%s", key, envName);
}
}
Après avoir préparé le fichier de définition comme suit
conf.properties
url=http://localhost/
url.Test=http://test.example.com/
url.Release=http://example.com/
Définissez la propriété système "Config" avec la valeur "Release" dans l'environnement de production. (* Je pense qu'il est plus simple d'ajouter "-DConfig = Release" aux variables d'environnement d'exécution)
Dans le vrai code, au début du processus
Configures.initialize(....)
(Pour les applications Web, il est préférable d'utiliser autour de ServletContextListener)
String url = Configures.get(Environment.ConnectUrl);
Ensuite, dans l'environnement où la propriété système n'est pas définie, la valeur de "http: // localhost /" et dans l'environnement de production, "http://example.com/" sera renvoyée.
Dans la classe de cas de test, etc., dans la méthode de configuration
System.setProperty(Configures.PropKey, "Test");
Si vous le faites, la valeur de "http://test.example.com/" sera transmise.