STACKJAVA

Code ví dụ Spring Profiles, tính năng Spring Boot Profiles

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:

Để 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