Comment injecter une valeur de propriété dans une classe non gérée par Spring?

1. Vue d’ensemble

De par leur conception, les classes annotées avec @ Repository, @Service, @Controller , etc. sont gérées par Spring et l’injection de configuration y est simple et naturelle. Ce qui n’est pas aussi simple, c’est de passer de la configuration à des classes qui ne sont pas directement gérées par Spring.

Dans ce cas, nous pouvons utiliser le chargement de configuration basé sur __ClassLoader - ou simplement instancier nos classes dans un autre bean et définir manuellement les paramètres requis - il s’agit de l’option recommandée, car les entrées de configuration n’ont pas besoin d’être stockées dans des fichiers ** .

Dans cet article rapide, nous allons couvrir le sujet du chargement de fichiers ** . Properties avec Java ClassLoader ainsi que de l’injection de configuration chargée par Spring dans une classe non gérée.

2. Charger la configuration avec Class Loader

En bref, les fichiers ** . Properties sont des fichiers de ressources contenant des informations de configuration. Au lieu d’utiliser des implémentations tierces prenant en charge le chargement automatique de la configuration de l’application, par ex. Cela implémenté dans Spring, nous pouvons utiliser Java ClassLoader pour faire la même chose.

Nous allons créer un objet conteneur qui contiendra Properties défini dans resourceFileName . Pour remplir le conteneur avec la configuration, nous allons utiliser un ClassLoader .

Définissons la classe PropertiesLoader qui implémente la méthode loadProperties (String resourceFileName) :

public class PropertiesLoader {

    public static Properties loadProperties(String resourceFileName) throws IOException {
        Properties configuration = new Properties();
        InputStream inputStream = PropertiesLoader.class
          .getClassLoader()
          .getResourceAsStream(resourceFileName);
        configuration.load(inputStream);
        inputStream.close();
        return configuration;
    }
}

Chaque objet Class contient une référence au ClassLoader qui l’instancie; c’est un objet principalement responsable du chargement des classes, mais dans ce tutoriel, nous l’utilisons pour charger un fichier de ressources au lieu d’une classe Java simple. ClassLoader recherche resourceFileName sur le chemin d’accès aux classes.

Ensuite, nous chargeons le fichier de ressources sous le nom InputStream via l’API getResourceAsStream .

Dans l’exemple ci-dessus, nous avons défini un conteneur de configuration pouvant analyser resourceFileName à l’aide de l’API load (InputStream) .

La méthode de chargement implémente l’analyse des fichiers ** . Properties en prenant en charge les caractères “:” ou “=” comme délimiteurs. De plus, les deux caractères “#” ou “!” Utilisés au début de la nouvelle ligne sont des marqueurs de commentaire et entraînent l’ignorance de cette ligne.

Enfin, lisons la valeur exacte de l’entrée de configuration définie dans nos fichiers de configuration:

String property = configuration.getProperty(key);

3. Chargement de la configuration avec Spring

Une deuxième solution consiste à utiliser la fonctionnalité Spring Spring pour gérer certains des chargements et traitements de bas niveau des fichiers.

Définissons un Initializer qui contiendra la configuration nécessaire pour initialiser notre classe personnalisée. Au cours de l’initialisation de Bean , la structure chargera tous les champs annotés avec @ Value à partir du fichier de configuration ** . Properties :

@Component
public class Initializer {

    private String someInitialValue;
    private String anotherManagedValue;

    public Initializer(
      @Value("someInitialValue") String someInitialValue,
      @Value("anotherValue") String anotherManagedValue) {

        this.someInitialValue = someInitialValue;
        this.anotherManagedValue = anotherManagedValue;
    }

    public ClassNotManagedBySpring initClass() {
        return new ClassNotManagedBySpring(
          this.someInitialValue, this.anotherManagedValue);
    }
}

Le Initializer peut maintenant être responsable de l’instanciation de ClassNotManagedBySpring.

Maintenant, nous allons simplement accéder à notre instance Initializer et exécuter la méthode initClass () pour gérer l’instanciation de notre instance personnalisée ClassNotManagedBySpring :

ClassNotManagedBySpring classNotManagedBySpring = initializer.initClass();

Une fois que nous aurons la référence à Initializer , nous pourrons instancier notre __ClassNotManagedBySpring personnalisé.

4. Résumé

Dans ce rapide tutoriel, nous nous sommes concentrés sur la lecture des propriétés dans une classe Java non-Spring.

Comme toujours, vous trouverez un exemple de mise en œuvre à l’adresse over sur GitHub .