Spring boot 1.X และ Spring Boot 2.X ไม่มีตัวเลือกและลักษณะการทำงานที่เหมือนกันเกี่ยวกับไฟล์Externalized Configuration.
คำตอบที่ดีมากของ M. Deinum หมายถึงข้อมูลจำเพาะของ Spring Boot 1
ฉันจะอัปเดตสำหรับ Spring Boot 2 ที่นี่
แหล่งที่มาและลำดับคุณสมบัติของสภาพแวดล้อม
Spring Boot 2 ใช้PropertySourceคำสั่งเฉพาะที่ออกแบบมาเพื่อให้สามารถลบล้างค่าได้อย่างสมเหตุสมผล คุณสมบัติจะพิจารณาตามลำดับต่อไปนี้:
คุณสมบัติการตั้งค่าส่วนกลาง Devtools บนโฮมไดเร็กทอรีของคุณ (~ / .spring-boot-devtools.properties เมื่อ devtools แอ็คทีฟ)
@TestPropertySource คำอธิบายประกอบในการทดสอบของคุณ
@SpringBootTest#propertiesแอตทริบิวต์คำอธิบายประกอบในการทดสอบของคุณ อาร์กิวเมนต์บรรทัดคำสั่ง
คุณสมบัติจากSPRING_APPLICATION_JSON(inline JSON ที่ฝังอยู่ในตัวแปรสภาพแวดล้อมหรือคุณสมบัติระบบ)
ServletConfig พารามิเตอร์ init
ServletContext พารามิเตอร์ init
JNDI แอตทริบิวต์จากjava:comp/env.
คุณสมบัติของระบบ Java ( System.getProperties())
ตัวแปรสภาพแวดล้อมระบบปฏิบัติการ
A RandomValuePropertySourceที่มีคุณสมบัติในการสุ่มเท่านั้น *.
คุณสมบัติของแอปพลิเคชันเฉพาะโปรไฟล์ภายนอกโถบรรจุของคุณ ( application-{profile}.propertiesและตัวแปร YAML)
คุณสมบัติการใช้งานเฉพาะโปรไฟล์ที่บรรจุอยู่ในโถของคุณ ( application-{profile}.propertiesและตัวแปร YAML)
คุณสมบัติของแอปพลิเคชันภายนอกโถบรรจุของคุณ ( application.propertiesและตัวแปร YAML)
คุณสมบัติการใช้งานที่บรรจุอยู่ในโถของคุณ ( application.propertiesและตัวแปร YAML)
@PropertySourceคำอธิบายประกอบใน@Configurationชั้นเรียนของคุณ คุณสมบัติเริ่มต้น (ระบุโดยการตั้งค่า
SpringApplication.setDefaultProperties)
ในการระบุไฟล์คุณสมบัติภายนอกตัวเลือกเหล่านี้คุณควรสนใจ:
คุณสมบัติของแอปพลิเคชันเฉพาะโปรไฟล์ภายนอกโถบรรจุของคุณ ( application-{profile}.propertiesและตัวแปร YAML)
คุณสมบัติของแอปพลิเคชันภายนอกโถบรรจุของคุณ ( application.propertiesและตัวแปร YAML)
@PropertySourceคำอธิบายประกอบใน@Configurationชั้นเรียนของคุณ คุณสมบัติเริ่มต้น (ระบุโดยการตั้งค่า
SpringApplication.setDefaultProperties)
คุณสามารถใช้เพียงหนึ่งใน 3 ตัวเลือกเหล่านี้หรือรวมเข้าด้วยกันตามความต้องการของคุณ
ตัวอย่างเช่นสำหรับกรณีที่ง่ายมากโดยใช้คุณสมบัติเฉพาะโปรไฟล์ก็เพียงพอแล้ว แต่ในกรณีอื่น ๆ คุณอาจต้องการใช้ทั้งคุณสมบัติเฉพาะโปรไฟล์คุณสมบัติเริ่มต้นและ@PropertySource.
ตำแหน่งดีฟอลต์สำหรับไฟล์ application.properties
เกี่ยวกับapplication.propertiesไฟล์ (และตัวแปร) โดยค่าเริ่มต้น Spring จะโหลดและเพิ่มคุณสมบัติในสภาพแวดล้อมจากสิ่งเหล่านี้ตามลำดับต่อไปนี้:
classpath:/,classpath:/config/,file:./,file:./config/จัดลำดับความสำคัญสูงจึงตัวอักษร:
จะใช้ไฟล์คุณสมบัติที่มีชื่อเฉพาะได้อย่างไร?
ตำแหน่งเริ่มต้นไม่เพียงพอเสมอไป: ตำแหน่งเริ่มต้นเช่นชื่อไฟล์เริ่มต้น ( application.properties) อาจไม่เหมาะสม นอกจากนี้เช่นเดียวกับในคำถาม OP คุณอาจต้องระบุไฟล์การกำหนดค่าหลายไฟล์นอกเหนือจากapplication.properties(และตัวแปร)
ดังนั้นspring.config.nameจะไม่เพียงพอ
ในกรณีนี้คุณควรระบุตำแหน่งที่ชัดเจนโดยใช้spring.config.locationคุณสมบัติสภาพแวดล้อม (ซึ่งเป็นรายการตำแหน่งไดเร็กทอรีหรือเส้นทางไฟล์ที่คั่นด้วยเครื่องหมายจุลภาค)
หากต้องการเป็นอิสระเกี่ยวกับรูปแบบชื่อไฟล์จะชอบรายการพา ธ ไฟล์มากกว่ารายการไดเร็กทอรี
ตัวอย่างเช่นทำเช่นนั้น:
java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
วิธีนี้เป็นวิธีที่ละเอียดที่สุดเพียงแค่ระบุโฟลเดอร์ แต่ยังเป็นวิธีระบุไฟล์คอนฟิกูเรชันของเราอย่างละเอียดและจัดทำเอกสารคุณสมบัติที่ใช้อย่างมีประสิทธิภาพอย่างชัดเจน
spring.config.location ตอนนี้แทนที่ตำแหน่งเริ่มต้นแทนที่จะเพิ่มเข้าไป
ด้วย Spring Boot 1 spring.config.locationอาร์กิวเมนต์จะเพิ่มตำแหน่งที่ระบุในสภาพแวดล้อม Spring
แต่จาก Spring Boot 2 spring.config.locationแทนที่ตำแหน่งเริ่มต้นที่ใช้โดย Spring โดยตำแหน่งที่ระบุในสภาพแวดล้อม Spring ตามที่ระบุไว้ในเอกสารในเอกสาร
เมื่อกำหนดค่าตำแหน่งการกำหนดค่าแบบกำหนดเองโดยใช้ตำแหน่ง
spring.config.locationเหล่านี้จะแทนที่ตำแหน่งเริ่มต้น ตัวอย่างเช่นถ้าspring.config.locationมีการกำหนดค่าที่มีค่า
classpath:/custom-config/, file:./custom-config/, ลำดับการค้นหาจะกลายเป็นดังต่อไปนี้:
file:./custom-config/
classpath:custom-config/
spring.config.locationตอนนี้เป็นวิธีตรวจสอบให้แน่ใจว่าapplication.propertiesต้องระบุไฟล์ใด ๆอย่างชัดเจน
สำหรับ uber JAR ที่ไม่ควรทำแพ็กเกจapplication.propertiesไฟล์นั้นค่อนข้างดี
หากต้องการรักษาพฤติกรรมเก่า ๆspring.config.locationในขณะที่ใช้ Spring Boot 2 คุณสามารถใช้spring.config.additional-locationคุณสมบัติใหม่แทนที่จะspring.config.locationยังคงเพิ่มตำแหน่งตามที่ระบุไว้ในเอกสาร :
หรือเมื่อกำหนดค่าตำแหน่งการกำหนดค่าแบบกำหนดเองโดยใช้
spring.config.additional-locationจะใช้นอกเหนือจากตำแหน่งเริ่มต้น
ในทางปฏิบัติ
ดังนั้นสมมติว่าในคำถาม OP คุณมีไฟล์คุณสมบัติภายนอก 2 ไฟล์ที่จะระบุและ 1 ไฟล์คุณสมบัติที่รวมอยู่ในโถ uber
ในการใช้เฉพาะไฟล์คอนฟิกูเรชันที่คุณระบุ:
-Dspring.config.location=classpath:/job1.properties,classpath:/job2.properties,classpath:/applications.properties
ในการเพิ่มไฟล์การกำหนดค่าลงในตำแหน่งเริ่มต้น:
-Dspring.config.additional-location=classpath:/job1.properties,classpath:/job2.properties
classpath:/applications.properties อยู่ในตัวอย่างสุดท้ายที่ไม่จำเป็นเนื่องจากตำแหน่งเริ่มต้นมีและตำแหน่งเริ่มต้นนั้นไม่ได้ถูกเขียนทับ แต่ขยาย
application.propertiesมักจะเต็มไปด้วยspring.config.locationคุณสามารถเพิ่มสถานที่การกำหนดค่าเพิ่มเติมที่ได้รับการตรวจสอบไฟล์ (นั่นคือเมื่อมันจบลงด้วย/) แต่ถ้าคุณใส่จุลภาครายการที่แยกออกจากกันในการมีที่ชี้ไปยังไฟล์เหล่านั้นจะถูกโหลด นอกจากนี้ยังมีคำอธิบายใน Spring Boot Reference Guide ที่นี่