Tôi cần mã logic khác nhau dựa trên hồ sơ môi trường hiện tại khác nhau. Làm thế nào bạn có thể nhận được các cấu hình hoạt động và mặc định hiện tại từ Spring?
Tôi cần mã logic khác nhau dựa trên hồ sơ môi trường hiện tại khác nhau. Làm thế nào bạn có thể nhận được các cấu hình hoạt động và mặc định hiện tại từ Spring?
Câu trả lời:
Mở rộng câu trả lời đơn giản hay của User1648825 (Tôi không thể nhận xét và chỉnh sửa của tôi đã bị từ chối):
@Value("${spring.profiles.active}")
private String activeProfile;
Điều này có thể ném IllegalArgumentException nếu không có cấu hình nào được đặt (tôi nhận được giá trị null). Đây có thể là một điều tốt nếu bạn cần thiết lập nó; nếu không sử dụng cú pháp 'mặc định' cho @Value, nghĩa là:
@Value("${spring.profiles.active:Unknown}")
private String activeProfile;
... activeProfile hiện chứa 'Unknown' nếu spring.profiles.active không thể được giải quyết
Dưới đây là một ví dụ đầy đủ hơn.
Môi trường tự động
Trước tiên, bạn sẽ muốn autowire môi trường bean.
@Autowired
private Environment environment;
Kiểm tra xem Hồ sơ có tồn tại trong Hồ sơ hoạt động không
Sau đó, bạn có thể sử dụng getActiveProfiles()
để tìm hiểu xem hồ sơ tồn tại trong danh sách các hồ sơ hoạt động. Dưới đây là một ví dụ lấy String[]
từ getActiveProfiles()
, lấy một luồng từ mảng đó, sau đó sử dụng các công cụ đối sánh để kiểm tra nhiều hồ sơ (Case-Insensitive) trả về một boolean nếu chúng tồn tại.
//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();
}
Bạn cũng có thể đạt được chức năng tương tự bằng cách sử dụng @Profile("local")
Cấu hình chú thích cho phép cấu hình chọn lọc dựa trên tham số môi trường hoặc thông qua. Dưới đây là thông tin thêm về kỹ thuật này: Hồ sơ mùa xuân
@Value("${spring.profiles.active}")
private String activeProfile;
Nó hoạt động và bạn không cần phải thực hiện Môi trường. Nhưng tôi không biết nhược điểm của phương pháp này.
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.profiles.active' in value "${spring.profiles.active}"
@Profile
. Ứng dụng cũng có thể sử dụng thuộc spring.profiles.include
tính và có thể thiết lập các cấu hình theo chương trình trong quá trình khởi tạo bằng cách sử dụng ConfigurableEnvironment
. Environment.getActiveProfiles()
sẽ nhận được danh sách đầy đủ các cấu hình được thiết lập bằng cách sử dụng bất kỳ cơ chế nào trong số này.
Nếu bạn không sử dụng tự động, chỉ cần thực hiện EnvironmentAware
Có vẻ như có một số nhu cầu để có thể truy cập tĩnh này.
Làm thế nào tôi có thể có được điều đó trong các phương thức tĩnh trong các lớp không được quản lý mùa xuân? - Aetherus
Đó là một hack, nhưng bạn có thể viết lớp của riêng bạn để phơi bày nó. Bạn phải cẩn thận để đảm bảo rằng không có gì sẽ gọi SpringContext.getEnvironment()
trước khi tất cả các hạt được tạo ra, vì không có gì đảm bảo khi thành phần này sẽ được khởi tạo.
@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;
}
}