משאבי התכנית @PropertySource של Spring

שְׁטָרִים @PropertySource היא השְׁטָר שֶׁמֻשְׁתָּמֵּש לְסַפֵּק קוֹבֵּץ מֵאֻפְיָן לִסְבַּב הַסְּבָּב שֶׁל Spring. השְׁטָר נִכְתָּב יַחַד עִם @Configuration במחלקות. שְׁטָר PropertySource שֶׁל Spring הוא נִיתָן לְחִזּוּר, וְזֹאת אוֹמֵר שֶׁתוֹכל לְהַכְנִיס מספר PropertySource עַל מַחֲלָקַת תְּצוּרָה. הַתְּכוּנָה הַזּוֹ זְמִינָה אִם אתָה משתמש ב-Java 8 או גרסה גבוהה יוֹתֵר.

דוגמה על שְׁטָר PropertySource שֶׁל Spring

בוא נַעֲבוֹר מַהֵר עַל אַפְלִיקָצְיָה קְטַנָּה שֶׁל Spring בָּה נִקְרָא פֶּרֶטֵי הַגְּדִרַיָיִם שֶׁל מְסָד נְתוּנִים מֵקוֹבֵּץ הַקוֹבֵּץ וּנוֹצֵר אֶת חַיּוּב הַמְּסָד. נְדַפְּסָה מִידָע כְּלַלִּי עַל הַמְּסָד לַקוֹנְסוֹל. יֵשׁ לִיצוֹר פְּרוֹיֵקט Maven פָּשׁוּט וּלהוֹסִיף תְּלִמּוּד Spring וְתְּלִמּוּד MySQL. תוּכְלוּ לְהִשְׁתַּמֵּש בְּכָל מְסָד נְתוּנִים אַחֵר לְדֵי הַדִּוגְמָה, רַק שִׁנּוּ אֶת הַתְּצוּרוֹת בְּהַתאם.

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>5.0.6.RELEASE</version>
</dependency>
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>5.1.46</version>
</dependency>

הַתְּמוּלֶת תְּמוּנָה מַצְיָנָת אֶת מַבּוּנוֹ הַסוֹפִּי שֶׁל הפרוֹיֵקט שֶׁלנו, וְנַעֲבוֹר דָּרְךְ כָּל הָרְכִּיבִים הַחָשׁוּבִים לְכָךְ יַחַד. זֶהוּ כְּתוֹם הַדֶּרֶך שֶׁלָּנו לִיצוֹר אֶת חִיבוּר הַמְּסָד נְתוּנִים.

package com.journaldev.spring;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBConnection {

	private String driverClass;
	private String dbURL;
	private String userName;
	private char[] password;
	private Connection con;

	public DBConnection(String driverClass, String dbURL, String userName, char[] password) {
		this.driverClass = driverClass;
		this.dbURL = dbURL;
		this.userName = userName;
		this.password = password;
	}

	public Connection getConnection() {
		if (this.con != null)
			return con;

		Connection con = null;
		try {
			System.out.println("Creating DB Connection");
			Class.forName(driverClass);
			con = DriverManager.getConnection(dbURL, userName, String.valueOf(password));
			System.out.println("Successfully Created DB Connection");
		} catch (ClassNotFoundException | SQLException e) {
			e.printStackTrace();
		}
		this.con = con;
		return con;
	}

	public void close() {
		System.out.println("DBConnection close called");
		if (this.con != null) {
			try {
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

הערה: אם אתה יוצר אפליקציה בעולם האמיתי, תוכל להשתמש ב-Spring ORM. בכך, ספרינג יטפל בניהול החיבור למסד נתונים ותוכל להתמקד בכתיבת הלוגיקה העסקית. עכשיו ניצור את מחלקת התצורה של ספרינג בה נשתמש ב-PropertySource אנוטציה.

package com.journaldev.spring;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;

@Configuration
@PropertySource("classpath:db.properties")
@PropertySource("classpath:root.properties")
public class DBConfiguration {

	@Autowired
    Environment env;
	
	@Bean
    public DBConnection getDBConnection() {
		System.out.println("Getting DBConnection Bean for App: "+env.getProperty("APP_NAME"));
		DBConnection dbConnection = new DBConnection(env.getProperty("DB_DRIVER_CLASS"), env.getProperty("DB_URL"), env.getProperty("DB_USERNAME"), env.getProperty("DB_PASSWORD").toCharArray());
        return dbConnection;
    }
	
}

שים לב שאני טוען קבצי מאפיינים מרובים לסביבת הספרינג. בוא נסתכל על תוכן קבצי המאפיינים האלו. db.properties

#הגדרות מסד נתונים MYSQL
DB_DRIVER_CLASS=com.mysql.jdbc.Driver
DB_URL=jdbc:mysql://localhost:3306/Test
DB_USERNAME=journaldev
DB_PASSWORD=journaldev

root.properties

APP_NAME=PropertySource Example

בוא ניצור את המחלקה הראשית ונקבל את פרטי מסד הנתונים.

package com.journaldev.spring;

import java.sql.Connection;
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();

		DBConnection dbConnection = context.getBean(DBConnection.class);

		Connection con = dbConnection.getConnection();

		System.out.println(con.getMetaData().getDatabaseProductName());
		System.out.println(con.getMetaData().getDatabaseProductVersion());

		// סגור את הקונטקסט של ספרינג
		context.close();
	}

}

פשוט הרץ את המחלקה שנכתבה לעיל כיישום Java, זה יפיק את הפלט הבא.

Getting DBConnection Bean for App: PropertySource Example
Creating DB Connection
Successfully Created DB Connection
MySQL
5.7.18
DBConnection close called

לקריאות טובה יותר, הסרתי את הודעות הדיבוג שיוצרות ספרינג בקונסול.

Spring @PropertySource קבצים מרובים – @PropertySources

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

@PropertySources({
@PropertySource("classpath:db.properties"),
@PropertySource("classpath:root.properties")})
public class DBConfiguration {
}

מגרסת Java 8 והלאה, ההערה PropertySource הפכה להיות ניתנת לחזרה. לגרסאות גירסה קודמות של Java, @PropertySources היה הדרך לספק קבצי מאפיינים מרובים למחלקת התצורה.

ערכי ההתעלמות של Spring PropertySource

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

קובץ חיצוני של Spring PropertySource

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

@PropertySource("file:/Users/pankaj/db.properties")

משתנה סביבת Spring PropertySource

שים לב שהתצורה לעיל לקרוא קובץ מאפיינים ממקום חיצוני תעבוד על המערכת המקומית שלי אך לא על מערכת של מישהו אחר או על השרת. ניתן גם לקרוא משתנים מערכתיים ב-PropertySource, כך שהתצורה למטה תתאים לכולם.

@PropertySource("file:${HOME}/db.properties")

Spring PropertySource מתעלמת מFileNotFoundException

אם קובץ המאפיינים לא נמצא, נקבל FileNotFoundException. לפעמים אנו לא רוצים לזרוק חריגה כי היישום שלנו יכול לעבוד עם ערכים ברירת מחדל. נוכל להשתמש ב-ignoreResourceNotFound של PropertySource ולשים אותו ב-true כדי לאמר לספריינג שלא לזרוק חריגה אם הקובץ לא נמצא.

@PropertySource(value = "classpath:root.properties", ignoreResourceNotFound=true)

זהו כל הדבר לדוגמה של PropertySource ב-Spring. ניתן לבדוק את קוד המקור ואת פרויקט Maven במאגר ה-GitHub שלנו.

פרויקט Spring PropertySource

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