Annotation @Value de Spring

La notation @Value de Spring est utilisée pour attribuer des valeurs par défaut aux variables et aux arguments de méthode. Nous pouvons lire les variables d’environnement Spring ainsi que les variables système en utilisant la notation @Value. La notation @Value de Spring prend également en charge SpEL. Regardons quelques exemples d’utilisation de la notation @Value.

Spring @Value – Valeur par Défaut

Nous pouvons attribuer une valeur par défaut à une propriété de classe en utilisant la notation @Value.

@Value("Default DBConfiguration")
private String defaultName;

La notation @Value ne peut prendre qu’une chaîne comme argument, mais Spring essaie de la convertir en le type spécifié. Le code ci-dessous fonctionnera bien et attribuera les valeurs booléennes et entières à la variable.

@Value("true")
private boolean defaultBoolean;

@Value("10")
private int defaultInt;

Spring @Value – Propriété d’Environnement Spring

@Value("${APP_NAME_NOT_FOUND}")
private String defaultAppName;

Si la clé n’est pas trouvée dans les propriétés de l’environnement Spring, alors la valeur de la propriété sera ${APP_NAME_NOT_FOUND}. Nous pouvons attribuer une valeur par défaut qui sera utilisée si la clé est absente des propriétés de l’environnement Spring.

@Value("${APP_NAME_NOT_FOUND:Default}")
private String defaultAppName;

Spring @Value – Environnement système

Lorsque l’environnement Spring est peuplé, il lit toutes les variables d’environnement système et les stocke en tant que propriétés. Ainsi, nous pouvons également attribuer des variables système en utilisant l’annotation @Value.

@Value("${java.home}")
private String javaHome;
	
@Value("${HOME}")
private String homeDir;

Spring @Value – SpEL

Nous pouvons également utiliser le langage d’expression Spring avec l’annotation @Value. Ainsi, nous pouvons également lire la propriété système java home en utilisant SpEL.

@Value("#{systemProperties['java.home']}")
private String javaHome;

Spring @Value avec des méthodes

Lorsque l’annotation @Value est trouvée sur une méthode, le contexte Spring l’invoquera lorsque toutes les configurations et les beans Spring seront en cours de chargement. Si la méthode a plusieurs arguments, alors la valeur de chaque argument est associée à partir de l’annotation de la méthode. Si nous voulons des valeurs différentes pour différents arguments, nous pouvons utiliser directement l’annotation @Value avec l’argument.

@Value("Test")
public void printValues(String s, String v){} //both 's' and 'v' values will be 'Test' 
@Value("Test")
public void printValues(String s, @Value("Data") String v){}
// s=Test, v=Data

Spring @Value Exemple

Créons une application Spring simple où nous utiliserons l’annotation @Value pour lire les propriétés et les assigner à des variables de classe. Créez un projet Maven et ajoutez les dépendances de base de Spring.

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>5.0.6.RELEASE</version>
</dependency>

Notre structure de projet finale ressemblera à l’image ci-dessous, nous examinerons chacun des composants un par un. Créez une classe de composant où nous injecterons les valeurs des variables via l’annotation @Value.

package com.journaldev.spring;

import org.springframework.beans.factory.annotation.Value;

public class DBConnection {

	@Value("${DB_DRIVER_CLASS}")
	private String driverClass;
	@Value("${DB_URL}")
	private String dbURL;
	@Value("${DB_USERNAME}")
	private String userName;
	@Value("${DB_PASSWORD}")
	private char[] password;

	public DBConnection() {
	}

	public void printDBConfigs() {
		System.out.println("Driver Class = " + driverClass);
		System.out.println("DB URL = " + dbURL);
		System.out.println("User Name = " + userName);

		// Ne faites jamais cela dans un environnement de production :D
		System.out.println("Password = " + String.valueOf(password));
	}
}

Maintenant, nous devons créer une classe de configuration et fournir une méthode @Bean pour la classe DBConnection.

package com.journaldev.spring;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource("classpath:db.properties")
@PropertySource(value = "classpath:root.properties", ignoreResourceNotFound = true)
public class DBConfiguration {

	@Value("Default DBConfiguration")
	private String defaultName;

	@Value("true")
	private boolean defaultBoolean;

	@Value("10")
	private int defaultInt;

	@Value("${APP_NAME_NOT_FOUND:Default}")
	private String defaultAppName;

	// @Value("#{systemProperties['java.home']}")
	@Value("${java.home}")
	private String javaHome;

	@Value("${HOME}")
	private String homeDir;

	@Bean
	public DBConnection getDBConnection() {
		DBConnection dbConnection = new DBConnection();
		return dbConnection;
	}

	@Value("Test")
	public void printValues(String s, @Value("another variable") String v) {
		System.out.println("Input Argument 1 =" + s);
		System.out.println("Input Argument 2 =" + v);

		System.out.println("Home Directory = " + homeDir);
		System.out.println("Default Configuration Name = " + defaultName);
		System.out.println("Default App Name = " + defaultAppName);
		System.out.println("Java Home = " + javaHome);
		System.out.println("Boolean = " + defaultBoolean);
		System.out.println("Int = " + defaultInt);

	}

}

Voici notre classe principale où nous créons un contexte Spring basé sur des annotations.

package com.journaldev.spring;

import java.sql.SQLException;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class SpringMainClass {

	public static void main(String[] args) throws SQLException {
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
		context.scan("com.journaldev.spring");
		context.refresh();
		System.out.println("Refreshing the spring context");
		DBConnection dbConnection = context.getBean(DBConnection.class);

		dbConnection.printDBConfigs();
		
		// fermez le contexte Spring
		context.close();
	}

}

Lorsque vous exécutez la classe, elle produira la sortie suivante.

Input Argument 1 =Test
Input Argument 2 =another variable
Home Directory = /Users/pankaj
Default Configuration Name = Default DBConfiguration
Default App Name = Default
Java Home = /Library/Java/JavaVirtualMachines/jdk-10.0.1.jdk/Contents/Home
Boolean = true
Int = 10
Refreshing the spring context
Driver Class = com.mysql.jdbc.Driver
DB URL = jdbc:mysql://localhost:3306/Test
User Name = journaldev
Password = journaldev

Remarquez que la classe de configuration printValues() est appelée avant que notre contexte ne soit prêt à répondre aux demandes de l’utilisateur. C’est tout pour l’exemple d’annotation Spring @Value. Vous pouvez télécharger le code d’exemple depuis notre dépôt GitHub.

Projet d’annotation Spring @Value

Source:
https://www.digitalocean.com/community/tutorials/spring-value-annotation