Code ví dụ Spring Profiles, tính năng Spring Boot Profiles
1. Spring Boot Profiles là gì?
Spring Profiles là tính năng giúp lựa chọn các cấu hình khác nhau của ứng dụng tùy theo môi trường
(Ví dụ: khi chạy trên môi trường test thì sẽ chạy với port này, cấu hình này… còn khi chạy trên môi trường product thì sẽ sử dụng cấu hình khác, port khác…)
1.1 Với file bean, component
Bất kỳ các Spring bean, component (@Component
, @Configuration
, @Bean
) đều có thể được đánh dấu @Profile
để giới hạn khi nó được tải.
Ví dụ: chỉ tải lên component khi ở môi trường development:
@Component @Profile("dev") public class DevCustomizer { ... }
Ví dụ chỉ tải lên component khi ở môi trường product:
@Component @Profile("prod") public class ProdCustomizer { ... }
1.2. Với các cấu hình (config) từ file properties, yaml
Mặc định Spring boot sẽ lấy thông tin cấu hình từ các file .properties
or .yaml
có định dạng:
application-{profile}.{properties|yml}
application.{properties|yml}
Để cấu hình riêng cho từng profiles (môi trường) ta sẽ tạo file cấu hình riêng cho nó:
Ví dụ file cấu hình cho môi trường development application-dev.properties
, file cấu hình cho môi trường product application-prod.properties
1.3. Lựa chọn profiles được tải lên khi chạy ứng dụng
Cách 1:
Cài đặt thuộc tinh spring.profiles.active
trong file application.properties
hoặc application.yml
Ví dụ: tải những cấu hình của profiles product và test khi chạy ứng dụng:
spring.profiles.active=prod, test
Cách 2:
Cài đặt thông qua interface ConfigurableEnvironment
khi chạy ứng dụng:
SpringApplication application = new SpringApplication(SpringBootProfilesApplication.class); ConfigurableEnvironment environment = new StandardEnvironment(); environment.setActiveProfiles("prod","test"); application.setEnvironment(environment); application.run(args);
Cách 3:
Thêm tham số khi chạy bằng command line: --spring.profiles.active=prod,test
2. Code ví dụ với Spring Boot Profiles
Các file bean, component:
package stackjava.com.springbootprofiles; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; @Configuration @EnableAutoConfiguration @ComponentScan({"stackjava.com.springbootprofiles"}) @SpringBootApplication public class SpringBootProfilesApplication { public static void main(String[] args) { // SpringApplication application = new SpringApplication(SpringBootProfilesApplication.class); // ConfigurableEnvironment environment = new StandardEnvironment(); // environment.setActiveProfiles("prod","test"); // application.setEnvironment(environment); // application.run(args); SpringApplication.run(SpringBootProfilesApplication.class, args); } @Bean @Profile("dev") public String dev() { System.out.println("++++++++++++++ dev environment"); return "dev"; } @Bean @Profile("prod") public String prod() { System.out.println("++++++++++++++ prod environment"); return "prod"; } @Bean @Profile("test") public String test() { System.out.println("++++++++++++++ test environment"); return "test"; } }
Các bean dev, prod, test
sẽ được tạo ra theo từng profiles tương ứng
package stackjava.com.springbootprofiles; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; @Component @Profile("dev") public class DevCustomizer implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> { @Override public void customize(ConfigurableServletWebServerFactory server) { server.setPort(9000); } }
Component DevCustomizer
chỉ được tải lên ở môi trường Development
package stackjava.com.springbootprofiles; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; @Component @Profile("prod") public class ProdCustomizer implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> { @Override public void customize(ConfigurableServletWebServerFactory server) { server.setPort(8000); } }
Component ProdCustomizer
chỉ được tải lên ở môi trường Product
package stackjava.com.springbootprofiles.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class BaseController { @Value("${environment}") private String environment; @RequestMapping("/") public String index(Model model) { model.addAttribute("environment", environment); return "index"; } }
File properties:
spring.profiles.active=prod, test
environment=Product
environment=Development
File view:
<html> <head> <title>Spring Boot</title> </head> <body> <h1>Environment</h1> <p th:text="${environment}" /> </body> </html>
Demo + Kết quả:
Code ví dụ Spring Profiles, tính năng Spring Boot Profiles
Okay, Done!
Download code ví dụ trên tại đây
References:
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html