אוטומטיזציה של הערך בעזרת הוספה

הערות @Value בהערה משמשות להקצאת ערכי ברירת מחדל למשתנים ולפרמטרי שיטה. ניתן לקרוא משתני סביבת ספרינג וגם משתנים מערכתיים באמצעות ההערה @Value. ההערה @Value של ספרינג תומכת גם בSpEL. בואו נסתכל על כמה דוגמאות לשימוש בהערת @Value.

ספרינג @Value – ערך ברירת המחדל

ניתן להקצות ערך ברירת מחדל למאפיין של מחלקה באמצעות הערת @Value.

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

@Value הערת ארגומנט יכולה להיות מחרוזת בלבד, אך ספרינג מנסה להמיר אותה לסוג המצויין. הקוד שבתחתית יעבוד נכון ויקצה ערכים בוליאניים ושלמים למשתנה.

@Value("true")
private boolean defaultBoolean;

@Value("10")
private int defaultInt;

ספרינג @Value – מאפיין סביבת ספרינג

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

אם המפתח לא נמצא בתכונות הסביבה של Spring, אז ערך המאפיין יהיה ${APP_NAME_NOT_FOUND}. אנו יכולים להקצות ערך ברירת מחדל שיתווסף אם המפתח חסר מתכונות הסביבה של Spring.

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

Spring @Value – סביבת המערכת

כאשר סביבת Spring מתווספת, היא קוראת את כל משתני הסביבה של המערכת ושומרת אותם כמאפיינים. לכן, אנו יכולים גם להקצות משתנים של המערכת באמצעות הערה @Value.

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

Spring @Value – SpEL

אנו יכולים גם להשתמש בשפת ביטויי Spring (SpEL) עם הערה @Value. כך שאנו יכולים גם לקרוא למאפיין של מערכת הבית של Java באמצעות SpEL.

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

Spring @Value עם שיטות

כאשר ההערה @Value נמצאת בשיטה, ההקשר של Spring יפעיל אותה כאשר כל התצורות והבינים של Spring מתקבלים. אם לשיטה יש ארגומנטים מרובים, אז ערך כל ארגומנט ממופה מההערה של השיטה. אם רוצים ערכים שונים עבור ארגומנטים שונים, אפשר להשתמש באפשרות @Value ישירות עם הארגומנט.

@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 מדוגמה

בואו ניצור יישום Spring פשוט בו נשתמש בהערת @Value כדי לקרוא מאפיינים ולהקצות אותם למשתנים במחלקה. יש ליצור פרוייקט Maven ולהוסיף תלות עיקרית של Spring Core.

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

המבנה הסופי של הפרוייקט ייראה כמו התמונה למטה, נסתכל על כל אחד מהרכיבים בנפרד. ליצור מחלקת רכיב שבה נכניס ערכי משתנים דרך ההערה @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);

		// אסור לעשות את הדברים הבאים בסביבת הפעולה הייצורית :D
		System.out.println("Password = " + String.valueOf(password));
	}
}

עכשיו עלינו ליצור מחלקת תצורה ולספק שיטת @Bean למחלקת חיבור למסד נתונים.

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);

	}

}

זהו הכיתה הראשית שלנו בה אנו יוצרים תחום סביבת Spring על פי הערות.

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();
		
		// סגור את תחום הסקייפי
		context.close();
	}

}

כאשר תפעיל את הכיתה, זו תפיק את הפלט הבא.

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

שים לב שהכיתה של התצורה printValues() מתקראת לפני שההקשר שלנו מוכן לשרת בקשות משתמש. זהו הכל לדוגמה של הערה של Spring @Value, תוכל להוריד את קוד הדוגמה ממאגר ה-GitHub שלנו.

פרויקט הערה של Spring @Value

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