مقدمة
من أجل التكوين بمرونة في المشاريع ، غالبًا ما نستخدم ملفات التكوين. ملفات التكوين الشائعة هي مثل XML والخصائص. يتيح Springboot استخدام الخصائص وملفات Yaml كتكوينات خارجية. إن دعم المترجم للغة YAML ليس جيدًا بما يكفي الآن ، ولا يزال ملف الخصائص يستخدم كتكوين خارجي.
قبل ظهور Spring Cloud Config ، قمت بتطبيق مركز التكوين المستند إلى ZK وألغيت ملف تكوين الخصائص المحلية. المبدأ بسيط للغاية ، لكنني أفرط في تحميل mergeProperties() من PropertyPlaceholderConfigurer:
/*** overload the merge property property* first load file properties ، ثم الاندماج في الخصائص التي يقرأها مركز تكوين ZK** @REGRENT REGED SERCLEAR* THROWS IOEXCENTION استثناء*/ @ @propertireds properties margeproperties () يلقي ioException {PROBERTISES نتيجة = خصائص جديدة () ؛ // تحميل تكوين خصائص الفئة الأصل MergeProperties = super.mergeProperties () ؛ النتيجة. // قم بتحميل قراءة التكوين من خريطة ZK <string ، string> configs = loadzkconfigs () ؛ result.putall (التكوينات) ؛ نتيجة العودة ؛} هذا التنفيذ سهل الاستخدام في مشاريع الربيع ، ولكن في الآونة الأخيرة ، وجدت بعض مشاريع الربيع في الربيع أن هذا التنفيذ من العناصر النائبة و SPRING BOOT's @ConfigurationProperties(prefix = "xxx") لا يمكن أن يعمل بشكل جيد.
أي أن الخصائص لم يتم حلها ، ويمكنك قراءتها بطريقة value ، ولكن إذا كان هناك العديد من الخصائص لـ @Value ، فإنها لا تزال مرهقة تمامًا. ما زلت أميل إلى استخدام بادئة ConfigurationProperties. لذلك نظرت إلى وثائق Boot Spring ووجدت أن PropertySource
طلب:
* خصائص الإعدادات العالمية DevTools على الدليل المنزلي الخاص بك (~/.Spring-boot-devtools.properties عندما يكون DevTools نشطًا).
* TestPropertysource التعليقات التوضيحية على اختباراتك.
* @springboottest#خصائص سمة التعليقات التوضيحية على الاختبارات الخاصة بك.
* وسيطات سطر الأوامر.
* خصائص من spring_application_json (مضمّنة JSON مضمنة في متغير البيئة أو خاصية النظام)
* servletconfig معلمات init.
* ServletContext معلمات init.
* سمات Jndi من Java: Comp/Env.
* خصائص نظام Java (System.getProperties ()).
* متغيرات بيئة OS.
* a randomvaluepropertysource التي لها خصائص فقط في عشوائي.*.
* خصائص التطبيق الخاصة بالملف الشخصي خارج الجرة المعبأة الخاصة بك (Application- {profile} .properties ومتغيرات YAML)
* خصائص التطبيق الخاصة بالملف الشخصي المعبأة داخل الجرة (التطبيق-{profile}.
* خصائص التطبيق خارج الجرة المعبأة (application.properties ومتغيرات YAML).
* خصائص التطبيق المعبأة داخل الجرة الخاصة بك (Application.Properties ومتغيرات YAML).
* @propertysource التعليقات التوضيحية على فصول التكوين الخاصة بك.
* الخصائص الافتراضية (المحددة باستخدام springapplication.setDefaultProperties).
ليس من الصعب العثور على أنه يمكنه التحقق من الخصائص في خصائص نظام Java. وهذا يعني ، فقط اكتب الخصائص التي يقرأها MergeProperties في الدعائم نظام Java ، وإلقاء نظرة على الكود المصدري ، وإيجاد نقطة الدخول.
/*** تطبيق خاصية المعالجة الزائدة* وفقًا للخيارات ، حدد ما إذا كنت ستكتب الدعائم المدمجة إلى خصائص النظام. يتطلب التمهيد الربيع * * param beanfactorytoprocess * param props properties * throws beansexception */ @ @overrideprotected processproperties (configurableListableBeanFactoryToProcess ، propsprocceporties) propsprocceptiS. // اكتب إلى خاصية النظام إذا (writepropstosystem) {// اكتب جميع الخصائص إلى نظام لتعداد التمهيد الربيعي <؟> propertyNames = props.propertynames () ؛ بينما (propertyNames.hasmoreElements ()) {String PropertyName = (String) propertyNames.NextElement () ؛ String PropertyValue = props.getProperty (propertyName) ؛ System.SetProperty (PropertyName ، PropertyValue) ؛ }}} لتجنب التأثير المفرط ، يتم تعيين مفتاح لكتابة خصائص النظام. إذا كان مشروع Boot Spring ، فقم بتشغيله ، وذلك لتقليل التأثير على مشاريع التمهيد غير الربيع عبر الإنترنت. بعد ذلك ، @ConfigurationProperties من SPRING BOOT اقرأ الخصائص بشكل مثالي ؛
راجع الكود المحدد: org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor
Overridepublic Object postprocessbeforeInitialization (كائن الفول ، سلسلة Beanname) يلقي beansexception {configurationProperties anotation = anotationutils .findannotation (bean.getClass () ، configurationProperties.class) ؛ if (التعليق التوضيحي! = null) {postprocessbeforeInitialization (Bean ، Beanname ، anotation) ؛ } التعليقات التوضيحية = this.beans.findfactoryannotation (beanname ، configurationProperties.class) ؛ if (التعليق التوضيحي! = null) {postprocessbeforeInitialization (Bean ، Beanname ، anotation) ؛ } إرجاع الفول ؛}لخص
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون لمحتوى هذه المقالة قيمة مرجعية معينة لدراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل. شكرا لك على دعمك إلى wulin.com.