6.3.3 Tạo bean có điều kiện với profile
Đôi khi, việc cung cấp một tập hợp bean riêng biệt cho từng profile là rất hữu ích. Thông thường, bất kỳ bean nào được khai báo trong một lớp cấu hình Java đều sẽ được tạo, bất kể profile nào đang được kích hoạt. Nhưng giả sử bạn cần một số bean chỉ được tạo nếu một profile cụ thể đang hoạt động. Trong trường hợp đó, annotation @Profile có thể dùng để chỉ định rằng các bean đó chỉ áp dụng cho một profile nhất định.
Ví dụ, giả sử bạn có một bean CommandLineRunner được khai báo trong TacoCloudApplication dùng để nạp dữ liệu nguyên liệu vào cơ sở dữ liệu nhúng khi ứng dụng khởi động. Điều này rất hữu ích cho môi trường phát triển nhưng lại không cần thiết (và không mong muốn) trong môi trường production. Để tránh việc dữ liệu nguyên liệu được nạp mỗi lần ứng dụng khởi động trong môi trường production, bạn có thể đánh dấu phương thức bean CommandLineRunner với @Profile như sau:
@Bean
@Profile("dev")
public CommandLineRunner dataLoader(IngredientRepository repo,
UserRepository userRepo, PasswordEncoder encoder) {
...
}Hoặc giả sử bạn cần tạo bean CommandLineRunner nếu profile dev hoặc qa được kích hoạt. Trong trường hợp đó, bạn có thể liệt kê các profile mà bean nên được tạo như sau:
@Bean
@Profile({"dev", "qa"})
public CommandLineRunner dataLoader(IngredientRepository repo,
UserRepository userRepo, PasswordEncoder encoder) {
...
}Bây giờ, dữ liệu nguyên liệu chỉ được nạp nếu profile dev hoặc qa đang hoạt động. Điều đó có nghĩa là bạn cần kích hoạt profile dev khi chạy ứng dụng trong môi trường phát triển. Thậm chí còn tiện lợi hơn nếu bean CommandLineRunner đó luôn được tạo trừ khi profile prod đang hoạt động. Trong trường hợp đó, bạn có thể áp dụng @Profile như sau:
@Bean
@Profile("!prod")
public CommandLineRunner dataLoader(IngredientRepository repo,
UserRepository userRepo, PasswordEncoder encoder) {
...
}Ở đây, dấu chấm than (!) phủ định tên profile. Về cơ bản, nó chỉ ra rằng bean CommandLineRunner sẽ được tạo nếu profile prod không được kích hoạt.
Bạn cũng có thể sử dụng @Profile cho toàn bộ lớp được đánh dấu với @Configuration. Ví dụ, giả sử bạn trích xuất bean CommandLineRunner vào một lớp cấu hình riêng có tên là DevelopmentConfig. Khi đó, bạn có thể đánh dấu DevelopmentConfig với @Profile như sau:
@Profile({"!prod", "!qa"})
@Configuration
public class DevelopmentConfig {
@Bean
public CommandLineRunner dataLoader(IngredientRepository repo,
UserRepository userRepo, PasswordEncoder encoder) {
...
}
}Tại đây, bean CommandLineRunner (cũng như bất kỳ bean nào khác được định nghĩa trong DevelopmentConfig) sẽ chỉ được tạo nếu cả hai profile prod và qa đều không được kích hoạt.
