คำนำ
เพื่อกำหนดค่าความยืดหยุ่นในโครงการเรามักจะใช้ไฟล์การกำหนดค่า ไฟล์การกำหนดค่าทั่วไปเช่น XML และคุณสมบัติ Springboot อนุญาตให้ใช้คุณสมบัติและไฟล์ YAML เป็นการกำหนดค่าภายนอก การสนับสนุนของคอมไพเลอร์สำหรับภาษา YAML นั้นไม่ดีพอในขณะนี้และไฟล์คุณสมบัติยังคงใช้เป็นการกำหนดค่าภายนอก
ก่อนที่ Spring Cloud Config ออกมาฉันใช้ศูนย์การกำหนดค่าที่ใช้ ZK และกำจัดไฟล์การกำหนดค่าคุณสมบัติในเครื่อง หลักการนั้นง่ายมาก แต่ฉันแค่ใช้ mergeProperties() ของ PropertyPlaceHolderConfigurer:
/*** โอเวอร์โหลดการใช้งานคุณสมบัติการผสาน* คุณสมบัติไฟล์โหลดครั้งแรกจากนั้นผสานเข้ากับคุณสมบัติที่อ่านโดยศูนย์การกำหนดค่า ZK** @@return การรวบรวมคุณสมบัติการรวมคุณสมบัติ* @throws ioexception ยกเว้น*/ @คุณสมบัติที่ได้รับการป้องกัน // โหลดการกำหนดค่าของคุณสมบัติคลาสแม่ mergeProperties = super.mergeProperties (); result.putall (mergeproperties); // โหลดการกำหนดค่าการอ่านจาก ZK Map <String, String> configs = loadzkConfigs (); result.putAll (configs); ผลตอบแทนผลลัพธ์;}
การใช้งานนี้ค่อนข้างใช้งานง่ายในโครงการฤดูใบไม้ผลิ แต่เมื่อเร็ว ๆ นี้โครงการฤดูใบไม้ผลิบางโครงการพบว่าการใช้งานตัวยึดตำแหน่งนี้และ @ConfigurationProperties(prefix = "xxx") ไม่สามารถทำงานได้ดี
นั่นคือคุณสมบัติไม่ได้รับการแก้ไขและคุณสามารถอ่านได้ด้วยวิธี @Value แต่ถ้ามีคุณสมบัติมากมายสำหรับ @Value มันก็ยังค่อนข้างยุ่งยาก ฉันยังคงมักจะใช้คำนำหน้าของ @ConfigurationProperties ดังนั้นฉันจึงดูเอกสารประกอบสปริงบูตและพบว่าอสังหาริมทรัพย์
คำสั่ง:
* คุณสมบัติการตั้งค่าทั่วโลกของ Devtools บนไดเรกทอรีโฮมไดเรกทอรีของคุณ (~/.spring-boot-devtools.properties เมื่อ devtools ทำงานอยู่)
* @TestPropertySource คำอธิบายประกอบในการทดสอบของคุณ
* @Springboottest#คุณสมบัติการอธิบายประกอบคุณสมบัติในการทดสอบของคุณ
* อาร์กิวเมนต์บรรทัดคำสั่ง
* คุณสมบัติจาก Spring_Application_JSON (Inline JSON ที่ฝังอยู่ในตัวแปรสภาพแวดล้อมหรือคุณสมบัติระบบ)
* พารามิเตอร์ ServletConfig Init
* พารามิเตอร์ servletContext init
* แอตทริบิวต์ JNDI จาก Java: comp/env
* คุณสมบัติของระบบ Java (System.getProperties ())
* ตัวแปรสภาพแวดล้อม OS
* สุ่ม ValuePropertySource ที่มีคุณสมบัติในการสุ่มเท่านั้น*
* คุณสมบัติแอปพลิเคชันเฉพาะโปรไฟล์นอกขวดบรรจุของคุณ (แอปพลิเคชัน-{โปรไฟล์} .properties และ Yaml ตัวแปร)
* คุณสมบัติแอปพลิเคชันเฉพาะโปรไฟล์ที่บรรจุอยู่ในขวดของคุณ (แอปพลิเคชัน-{โปรไฟล์} .properties และ yaml ตัวแปร)
* คุณสมบัติแอปพลิเคชันนอกขวดบรรจุหีบห่อของคุณ (แอปพลิเคชัน. properties และตัวแปร yaml)
* คุณสมบัติแอปพลิเคชันที่บรรจุอยู่ในขวดของคุณ (แอปพลิเคชัน. properties และ yaml ตัวแปร)
* @PropertySource คำอธิบายประกอบในคลาส @Configuration ของคุณ
* คุณสมบัติเริ่มต้น (ระบุโดยใช้ SpringApplication.SetDefaultProperties)
ไม่ยากที่จะพบว่าสามารถตรวจสอบคุณสมบัติในคุณสมบัติของระบบ Java กล่าวคือเพียงแค่เขียนคุณสมบัติที่อ่านโดย MergeProperties ลงในอุปกรณ์ประกอบฉากของระบบ Java ดูที่ซอร์สโค้ดและค้นหาจุดเข้า
/*** การใช้งานคุณสมบัติการประมวลผลโอเวอร์โหลด* ตามตัวเลือกตัดสินใจว่าจะเขียนอุปกรณ์ประกอบฉากที่ผสานลงในคุณสมบัติของระบบหรือไม่ สปริงบูตต้องการ * * @param beanfactorytoprocess * @param อุปกรณ์ประกอบฉากที่ผสาน * @throws beansexception */ @overrideprotected void processproperties (configurableListableBeanfactory beanfactoryToprocess // เขียนไปยังคุณสมบัติระบบถ้า (writepropstosystem) {// เขียนคุณสมบัติทั้งหมดไปยังระบบสำหรับการแจงนับการบูตสปริง <?> propertyNames = props.propertyNames (); ในขณะที่ (propertyNames.hasmoreElements ()) {สตริงคุณสมบัติ name = (string) propertyNames.nextElement (); String PropertyValue = props.getProperty (PropertyName); System.SetProperty (PropertyName, PropertyValue); - เพื่อหลีกเลี่ยงผลกระทบที่มากเกินไปสวิตช์จะถูกตั้งค่าเป็นคุณสมบัติของระบบ หากเป็นโครงการสปริงบูตเปิดใช้งานเพื่อลดผลกระทบต่อโครงการบูตที่ไม่ใช่สปริงออนไลน์ จากนั้น @ConfigurationProperties ของสปริงบูตอ่านคุณสมบัติอย่างสมบูรณ์แบบ;
ดูรหัสเฉพาะ: org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor
@OverridePublic Object postprocesseforeinitialization (Object Bean, String Beanname) พ่น beansexception {configurationProperties Annotation = AnnotationUtils .Findannotation (bean.getClass (), configurationProperties.class); if (คำอธิบายประกอบ! = null) {postprocessbeforeinitialization (ถั่ว, Beanname, คำอธิบายประกอบ); } Annotation = this.beans.findfactoryannotation (BeanName, ConfigurationProperties.class); if (คำอธิบายประกอบ! = null) {postprocessbeforeinitialization (ถั่ว, Beanname, คำอธิบายประกอบ); } return bean;}สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com