مقدمة
في الوقت الحاضر ، ستوفر معظم تطبيقات Java تقريبًا ، مثل Tomcat و Struts2 و Netty وما إلى ذلك ، والتي نعرفها ، ملفات التكوين للمستخدمين لتخصيص وظائف لتلبية العمومية.
حتى أن هناك بعض أطر عمل الشبكة مثل Netty والتي يتم تكوينها بالكامل تقريبًا ، وعادة ما نسميها مثل هذا البرنامج "بنية Microker". كل ما تقوم بتكوينه ، هذا ما هو عليه.
هذا ما تقوم بتكوينه ليكون.
تنسيقات ملفات التكوين الأكثر شيوعًا هي XML والخصائص والملفات الأخرى.
تناقش هذه المقالة السيناريو الأكثر شيوعًا وشائعًا في تكوينات التحميل ، والتي تتمثل في تعيين ملف تكوين في كائن POJO في Java.
واستكشاف كيفية تنفيذ طرق مختلفة للتحميل. على سبيل المثال ، يتم تحميل بعض التكوينات من ملفات XML المحلية ، في حين أن بعض التكوينات تحتاج إلى تحميل من ملفات الخصائص المحلية.
ما هو أكثر من ذلك ، يجب تحميل بعض التكوينات من خلال الشبكة.
كيفية تنفيذ آلية تحميل التكوين هذه بحيث بعد هذه الآلية ، لن يتم نشر تكوين تحميل التعليمات البرمجية في كل مكان ، ويمكن التوسع فيه.
تكوين المحمل
أولاً ، نحتاج إلى محمل تكوين ، ويمكن أن يحتوي محمل التكوين هذا على العديد من طرق التحميل المختلفة. لذلك ، نستخدم واجهة لوصفها على النحو التالي:
/** * * * * Author Bean * date 21 يناير 2016 في 11:47:12 AM * Version 1.0 * */واجهة عامة iconfigloader <T> {/** * قم بتحميل typed typed by t * * regun * @throws configexception */public t load ؛ولكن لماذا نحتاج إلى إعلان الأدوية الجيلية <T> على هذه الواجهة؟
من الواضح ، عندما نريد استخدام محمل التكوين ، يجب عليك إخبار محمل التكوين هذا بالنتائج التي تحتاج إلى الحصول عليها بعد التحميل.
على سبيل المثال ، إذا كنت ترغب في تحميل التكوين والحصول على كائن AppleConfig ، فيمكنك استخدام الواجهة المحددة أعلاه:
iconfigloader <AppleconFig> loader = جديد AppleconFigLoader <AppleconFig> () ؛
appleconfig config = loader.load () ؛
لذلك يمكنك تحويل المعلومات الموجودة في ملف التكوين إلى كائن AppleconFig ، ويمكنك الحصول على مثيل كائن AppleConfig هذا.
حتى الآن ، يبدو أنه طالما أن AppleconFigloader الخاص بنا ينفذ العمل المحدد لكيفية تحميل ملفات التكوين ، يمكننا بسهولة تحميل التكوينات.
يمكن القول ذلك ، ولكن لا يمكن تحميل التكوين بطرق مختلفة ، مثل التحميل من خلال الخصائص أو DOM أو SAX أو التحميل من خلال بعض مكتبات المصادر المفتوحة من الجهات الخارجية.
لذلك ، بالإضافة إلى تكوين المحمل ، نحتاج أيضًا إلى دور آخر ، مزود تكوين طريقة التحميل. دعنا نسميها iconfigprovider.
تكوين مزود طرق التحميل
يمكن أن يوفر مزود طرق تحميل التكوين طريقة تحميل لعملية تحميل التكوين ، بمعنى آخر ، كائن لعملية تكوين.
تتمثل مسؤولية المزود في توفير ، هذا كل شيء ، فقط توفير الكائنات المطلوبة لتكوين المحمل ، لكنها في حد ذاتها لا تشارك في عمل تكوين التحميل.
نستخدم iconfigprovider واجهة لتحديد هذا المزود
/** * * * * Author Bean * date 21 يناير 2016 في 11:54:28 AM * VERVENT
لماذا هناك <T> هنا لإعلان الأدوية؟
إذا كنت بحاجة إلى مزود ، فيجب عليك على الأقل إخبار المزود بما يجب أن يوفره.
لذلك ، ما سيقدمه المزود يحدده هذا.
في الوقت نفسه ، يمكننا أولاً بناء مصنع والسماح له بإنتاج مقدمي خدمات محددة:
/** * * * * Author Bean * date 21 يناير 2016 في 11:56:28 AM * Version 1.0 * */class classeproviderfactory {private configproviderfactory () {throw new UnsupportedOperationException ("غير قادر على تهيئة فئة المصنع:" + getClass (). getImplename () ؛ } iconfigprovider الثابتة العامة <Convice> createCumentProvider (سلسلة FilePath) {return new documentProvider (filePath) ؛ } iconfigprovider الثابتة العامة <Properties> CreateProperTiesProvider (سلسلة FilePath) {return New PropertiesProvider (FilePath) ؛ } iconfigprovider الثابت العام <Gigester> createGesterProvider (سلسلة FilePath) {return new DigesterProvider (filePath) ؛ }}هل يمكنك البدء في تنفيذ محمل التكوين المحدد؟
ليس موافق بعد!
في هذه المرحلة ، افترض أن لدينا ملف تكوين يسمى Apple.xml. ونحن بحاجة إلى تحميل Apple.xml هذا في كائن AppleConfig من خلال DOM.
لذلك ، أولاً وقبل كل شيء ، أريد إنشاء مزود يمكنه توفير المستند من خلال مصنع المزود. ثم أحصل على هذا المزود ويمكنني الاتصال به طريقة توفيرها للحصول على كائن المستند. باستخدام كائن المستند ، يمكنني البدء في تحميل التكوين.
ومع ذلك ، إذا كنت ترغب في تحميل BananaconFig ، Pearconfig ... ، فإن الخطوات هي نفسها. لذلك ، نحتاج أيضًا إلى فئة مجردة لتنفيذ بعض السلوكيات الشائعة الافتراضية.
/** * * * * Author Bean * date 21 يناير ، 2016 في 11:59:19 AM * Version 1.0 * *//Public Abstract Class AbstractConfigloader <T ، U> Iconfigloader <T> {protected iconfigprovider <u> Provider ؛ محمي AbstractConfigLoader (IconFigProvider <u> Provider) {this.provider = Provider ؛ } / * * see iconfigloader#load () * / Override public t load () يلقي configexception {return load (getProvider (). } remoxt التجريدي العام (U loadersource) يلقي configException ؛ iconfigprovider المحمي <u> getProvider () {return this.provider ؛ }}يحتوي كل محمل تكوين على مُنشئ للمعلمات يتلقى مزودًا.
يشير العام إلى ما إذا كنت أرغب في تحميل AppleConfig أو BananconFig. يشير <u> العام إلى طريقة التحميل التي يتم تحميلها ، هل هي مستند أو خصائص أو أي شيء آخر.
أمثلة التطبيق العملي
يوجد سوق ملفات سوق الخضروات. xml ، الذي يقوم بتكوين منتجات سوق الخضروات ، بما في ذلك منتجين ، وهما التفاح والبيض.
<Market> <Apple> <loor> Red </loy> <crate> 100 </suply> </Apple> <geg> <eight> 200 </ulight> </egh> </price>
يوجد أيضًا ملف تكوين لأسماء الرؤساء في كل كشك ، owner.properties
port1 = ستيف جوبز
port2 = بيل غيتس
Port3 = كوبي براينت
دعونا أولاً نحدد الفصل التالي: MarketConfig.java
/** * * * Author Bean * date 21 يناير 2016 في 11:03:37 PM * Version 1.0 * */Public Class MarketConfig {private Appleconfig AppleConfig ؛ خاص EggConfig EggConfig ؛ الخاص ownerconfig ownerconfig ؛ Public AppleConfig getAppleConfig () {return AppleConfig ؛ } public void setappleconfig (AppleConfig AppleConfig) {this.appleConfig = AppleConfig ؛ } public eggconfig geteggconfig () {return eggconfig ؛ } public void seteggconfig (EggConfig EggConfig) {this.eggconfig = eggconfig ؛ } public ownerconfig getOwnerConfig () {return ownerConfig ؛ } public void setownerconfig (ownerConfig ownerConfig) {this.ownerconfig = ownerConfig ؛ }}appleconfig.java
/** * * * Author Bean * date 21 يناير 2016 في 11:03:45 PM * Version 1.0 * */public Class Appleconfig {private int price ؛ لون السلسلة الخاص public void setPrice (int price) {this.price = price ؛ } public int getPrice () {return this.price ؛ } public void setColor (string color) {this.color = color ؛ } السلسلة العامة getColor () {return this.color ؛ }}EggConfig.java
/** * * * Author Bean * date 21 يناير 2016 في 11:03:58 PM * Version 1.0 * */Public Class EggConfig {private int weight ؛ public void setweight (int weight) {this.weight = weight ؛ } public int getweight () {return this.weight ؛ }}ownerconfig.java
/** * * * Author Bean * date 21 يناير 2016 في 11:04:06 PM * Version 1.0 * */public class ownerconfig {private map <String ، string> owner = new hashmap <string ، string> () ؛ addowner public void (سلسلة portname ، string owner) {this.owner.put (portname ، owner) ؛ } السلسلة العامة getOwNerByPortName (String portName) {return this.Owner.get (portName) ؛ } الخريطة العامة <string ، string> getOwners () {return collections.unmodiAbleBlemap (this.Owner) ؛ }}هناك طريقتان لتحميل التكوين لهذا المثال ، وهما طرق تحميل DOM وخصائص.
لذلك يحتاج مقدمونا إلى بناء مصانع مع اثنين من مقدمي الخدمات.
ويجب تحديد محمولين للتكوين ، وهما::
OwnerConfigloader
/** * * * * Author Bean * date 21 يناير ، 2016 في 11:24:50 PM * Version 1.0 * */public class ownerconfigloader يمتد ملخص ustructionConfigLoader <ownerconfig ، properties> {/** provider) } / * * seee abstractConfigloader#load (java.lang.object) * / Override public ownerconfig load (خصائص الدعائم) يلقي configexception {ownerconfig ownerconfig = new ownerconfig () ؛ / ** * استخدم الدعائم لتعيين قيمة خاصية OwnerConfig * * تم حذف الكود هنا */ إرجاع OwnerConfig ؛ }}ثم هناك MarketConfigloader
استيراد org.w3c.dom.document ؛/** * * * Author Bean * date 21 يناير ، 2016 في 11:18:56 PM * version 1.0 * */public class marketConfigloader يمتد ملخص ustructionConfigloader <marketConfig ، document> {/** * param provider */protected MarketConfirlovider) } / * * AbstractConfigloader#load (java.lang.object) * / Override Public MarketConfig Load (وثيقة المستند) يلقي configexception {MarketConfig MarketConfig = جديد MarketConfig () ؛ AppleConfig AppleConfig = new AppleConfig () ؛ EggConfig EggConfig = New EggConfig () ؛ / ** * قم بمعالجة المستند هنا ، وبعد ذلك يمكنك الحصول على * AppleConfig و EggConfg * * تم حذف الكود هنا */ marketConfig.SetAppleConfig (Appleconfig) ؛ MarketConfig.SeteggConfig (EggConfig) ؛ / ** * نظرًا لأن OwnerConfig يتطلب التحميل ، فهو ليس XML * ، لذا نحتاج هنا إلى إنشاء ownerconfigloader جديد وتفويضه لتحميل ownerconfig */ ownerconfigloader ownerconfigloader = new ownfigloader (configproviderfactory.createproperoperiperiperiesperiperies (your your_file_pather) ؛ ownerConfig ownerConfig = ownerConFigLoader.load () ؛ MarketConfig.setownerconfig (OwnerConfig) ؛ عودة MarketConfig ؛ }}ثم ، كيف نحصل على MarketConfig على مستوى التطبيق؟
MarketConfigloader MarketConfigloader = جديد MarketConfigloader (configproviderfactory.createdocumentProvider (your_file_path)) ؛ MarketConfig MarketConfig = MarketConfigloader.load () ؛
ربما هناك مكان قد يفاجأ فيه الناس. من الواضح أن هناك أربع فئات تكوين ، فلماذا لا يوجد سوى محمولين للتكوين؟ نظرًا لأن MarketConfig و EggConfig و AppleConfig يتم تحميلهم جميعًا من نفس ملف تكوين XML ، طالما يتم استخدام كائن المستند ، يمكن تحميله من خلال MarketConfigloader.
OwnerConfig هي طريقة تحميل مختلفة ، لذلك هناك حاجة إلى محمل آخر.
لخص
لا يمكن أن تساعد آلية تحميل التكوين المقترحة في هذه المقالة في تحميل التكوين. يجب أن يترك هذا إلى DOM و SAX وبعض مكتبات المصادر المفتوحة الأخرى مثل DOM4J و Digster. ومع ذلك ، فإن آلية تحميل التكوين المقترحة في هذه المقالة يمكن أن تجعل آلية تحميل التكوين أكثر مرونة وسهلة التوسع ، ويمكن أن تدمج طرق تحميل التكوين المتعددة ، ودمجها في آلية واحدة ، وتشغيل نقاطها الخاصة.
في الواقع ، غالبًا ما تحتاج بعض البرامج إلى تحميل التكوينات من ملفات التكوين ذات التنسيقات المختلفة في نفس الوقت ، مثل Struts2 ، وبرنامج وسيطة قاعدة بيانات قاعدة بيانات مفتوح المصدر المحلي الذي كنت أبحث عنه في الدم وأتقيأ مؤخرًا. إذا لم تكن هناك آلية تحميل تكوين كاملة ، فسيتم تشتت الرمز ولا يمكن صيانته بشكل كبير. يمكن أن يتسبب بسهولة في التقيؤ على الدم.
من خلال هذه المقالة ، آمل أن يتمكن الجميع من فهم وإتقان معرفة آلية تحميل تكوين Java. شكرا لدعمكم لهذا الموقع!