ฉันต้องการรหัสตรรกะที่แตกต่างกันตามโปรไฟล์สภาพแวดล้อมปัจจุบัน คุณจะรับโปรไฟล์ที่ใช้งานและเริ่มต้นปัจจุบันจาก Spring ได้อย่างไร
ฉันต้องการรหัสตรรกะที่แตกต่างกันตามโปรไฟล์สภาพแวดล้อมปัจจุบัน คุณจะรับโปรไฟล์ที่ใช้งานและเริ่มต้นปัจจุบันจาก Spring ได้อย่างไร
คำตอบ:
คำตอบง่ายๆที่ดีของ User1648825 การขยาย (ฉันไม่สามารถแสดงความคิดเห็นและแก้ไขของฉันถูกปฏิเสธ):
@Value("${spring.profiles.active}")
private String activeProfile;
สิ่งนี้อาจส่ง IllegalArgumentException หากไม่มีการตั้งค่าโปรไฟล์ (ฉันได้รับค่า Null) นี่อาจเป็นสิ่งที่ดีหากคุณต้องการตั้งค่า หากไม่ใช้ไวยากรณ์ 'default' สำหรับ @Value เช่น:
@Value("${spring.profiles.active:Unknown}")
private String activeProfile;
... activeProfile ตอนนี้มี 'ไม่ทราบ' หากไม่สามารถแก้ไข spring.profiles.active
นี่คือตัวอย่างที่สมบูรณ์มากขึ้น
สภาพแวดล้อม Autowire
ก่อนอื่นคุณจะต้องป้อนสภาวะแวดล้อมให้อัตโนมัติ
@Autowired
private Environment environment;
ตรวจสอบว่ามีโปรไฟล์อยู่ในโปรไฟล์ที่ใช้งานอยู่หรือไม่
จากนั้นคุณสามารถใช้getActiveProfiles()
เพื่อดูว่ามีโปรไฟล์อยู่ในรายการโปรไฟล์ที่ใช้งานอยู่หรือไม่ นี่คือตัวอย่างที่ใช้String[]
จากgetActiveProfiles()
รับกระแสจากอาร์เรย์นั้นจากนั้นใช้ matchers เพื่อตรวจสอบหลายโปรไฟล์ (Case-Insensitive) ซึ่งส่งกลับบูลีนหากพวกเขามีอยู่
//Check if Active profiles contains "local" or "test"
if(Arrays.stream(environment.getActiveProfiles()).anyMatch(
env -> (env.equalsIgnoreCase("test")
|| env.equalsIgnoreCase("local")) ))
{
doSomethingForLocalOrTest();
}
//Check if Active profiles contains "prod"
else if(Arrays.stream(environment.getActiveProfiles()).anyMatch(
env -> (env.equalsIgnoreCase("prod")) ))
{
doSomethingForProd();
}
นอกจากนี้คุณยังสามารถใช้ฟังก์ชันที่คล้ายกันได้โดยใช้คำอธิบายประกอบที่@Profile("local")
อนุญาตให้ใช้สำหรับการกำหนดค่าที่เลือกตามพารามิเตอร์การส่งผ่านหรือสภาพแวดล้อม นี่คือข้อมูลเพิ่มเติมเกี่ยวกับเทคนิคนี้: Spring Profiles
@Value("${spring.profiles.active}")
private String activeProfile;
มันทำงานได้และคุณไม่จำเป็นต้องใช้ EnvironmentAware แต่ฉันไม่ทราบข้อเสียของวิธีการนี้
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.profiles.active' in value "${spring.profiles.active}"
@Profile
ข้อเสียเปรียบแนวทางนี้ก็คือว่ามันจะไม่ได้รับทั้งหมดของโปรไฟล์ที่ฤดูใบไม้ผลิอาจพิจารณาเมื่อมีการประเมิน ปพลิเคชันสามารถใช้ทรัพย์สินและสามารถตั้งค่าโปรไฟล์โปรแกรมในระหว่างการเตรียมใช้spring.profiles.include
จะได้รับรายการทั้งหมดของโปรไฟล์ที่ตั้งค่าโดยใช้กลไกใด ๆ เหล่านี้ ConfigurableEnvironment
Environment.getActiveProfiles()
หากคุณไม่ได้ใช้การลงทะเบียนอัตโนมัติเพียงดำเนินการ EnvironmentAware
ดูเหมือนว่ามีความต้องการที่จะสามารถเข้าถึงแบบคงที่นี้
ฉันจะได้รับสิ่งนั้นในวิธีการคงที่ในชั้นเรียนที่ไม่มีสปริงจัดการได้อย่างไร - Aetherus
มันเป็นแฮ็ค แต่คุณสามารถเขียนคลาสของคุณเองเพื่อแสดงมัน คุณต้องระมัดระวังเพื่อให้แน่ใจว่าไม่มีสิ่งใดที่จะเรียกSpringContext.getEnvironment()
ก่อนที่จะสร้างถั่วทั้งหมดเนื่องจากไม่มีการรับประกันว่าส่วนประกอบนี้จะถูกสร้างขึ้นเมื่อใด
@Component
public class SpringContext
{
private static Environment environment;
public SpringContext(Environment environment) {
SpringContext.environment = environment;
}
public static Environment getEnvironment() {
if (environment == null) {
throw new RuntimeException("Environment has not been set yet");
}
return environment;
}
}