التعليق الوظيفي Spring @PropertySource يُستخدم لتوفير ملف الخصائص لبيئة Spring. يُستخدم هذا التعليق مع فئات @Configuration
. تعليق Spring PropertySource قابل للتكرار، مما يعني أنه يمكنك وجود العديد من PropertySource على فئة التكوين. هذه الميزة متاحة إذا كنت تستخدم Java 8 أو إصدارًا أعلى.
مثال على Spring PropertySource
دعنا ننتقل بسرعة إلى تطبيق بسيط في Spring حيث سنقرأ تفاصيل تكوين قاعدة البيانات من ملف الخصائص وننشئ اتصالًا بقاعدة البيانات. سنقوم بطباعة بعض المعلومات الوصفية لقاعدة البيانات إلى وحدة التحكم. أنشئ مشروع ميفن بسيطًا وأضف تبعيات 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();
}
}
}
}
NOTE: إذا كنت تقوم بإنشاء تطبيق في العالم الحقيقي ، يمكنك استخدام Spring ORM. بهذه الطريقة، ستهتم Spring بإدارة اتصال قاعدة البيانات ويمكنك التركيز على كتابة منطق الأعمال. الآن دعونا نقوم بإنشاء فئة تكوين Spring حيث سنستخدم تعليق 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;
}
}
لاحظ أنني أقوم بتحميل ملفات خصائص متعددة إلى بيئة Spring. دعونا نلقي نظرة على محتوى هذه الملفات الخاصة بالخصائص. 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());
// أغلق سياق Spring
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 لتحميل ملفات الخصائص من نظام الملفات أيضًا.
@PropertySource("file:/Users/pankaj/db.properties")
تحميل خصائص الربيع من متغير البيئة
لاحظ أن التكوين أعلاه لقراءة ملف الخصائص من الموقع الخارجي سيعمل على النظام المحلي الخاص بي ولكن لن يعمل على جهاز شخص آخر أو على الخادم. يمكننا أيضًا قراءة المتغيرات النظام في PropertySource، لذا ستعمل التكوين التالي للجميع.
@PropertySource("file:${HOME}/db.properties")
تجاهل Spring PropertySource لـ FileNotFoundException
إذا لم يتم العثور على ملف الخاصية ، فسوف نحصل على FileNotFoundException
. في بعض الأحيان لا نرغب في رمي استثناء لأن التطبيق الخاص بنا يمكن أن يعمل أيضًا بقيم افتراضية. يمكننا استخدام PropertySource ignoreResourceNotFound
وتعيينه على true
لإخبار إطار Spring بعدم رمي استثناء إذا لم يتم العثور على الملف.
@PropertySource(value = "classpath:root.properties", ignoreResourceNotFound=true)
هذا كل شيء بالنسبة لمثال Spring PropertySource. يمكنك مراجعة الشفرة المصدرية ومشروع Maven من مستودع GitHub الخاص بنا.
Source:
https://www.digitalocean.com/community/tutorials/spring-propertysource