ConfigurationProperties
Spring Boot এ অনেক সময় আমাদের নিজস্ব configuration তৈরি করার দরকার পড়ে। তখন কাজে লাগে ConfigurationProperties অ্যানোটেশন
ConfigurationProperties এনোটেশন কীভাবে কাজ করে?
১ । এই অ্যানোটেশন Spring Boot-কে বলে দেয় — “এই prefix দিয়ে শুরু হওয়া সব কনফিগারেশন এই ক্লাসে bind করো।
২ । ConfigurationProperties এনোটেশন দিয়ে আমরা application.yml বা application.properties ফাইলের কনফিগারেশনকে Java ক্লাসে map করতে পারি।
৩। এটা nested (হায়ারার্কিকাল) configuration-এর ক্ষেত্রেও কাজ করে।
উদাহরণ
@Component
@ConfigurationProperties(prefix = "app")
@Setter
@Gettrer
public class AppConfig {
private Database database;
private List<Service> services;
// Nested static class: Database config
@Setter
@Getter
public static class Database {
private String url;
private String username;
private String password;
}
// Nested static class: Service config
@Setter
@Getter
public static class Service {
private String name;
private int timeout;
}
}application.yml ফাইল
app:
database:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: secret
services:
- name: email
timeout: 5000
- name: payment
timeout: 3000কীভাবে কাজ করে
- @ConfigurationProperties(prefix = "app") বলছে, Spring Boot app দিয়ে শুরু হওয়া সব কনফিগারেশন এই ক্লাসে bind করবে
- database অংশটা যাবে AppConfig.Database ক্লাসে
- services অংশটা AppConfig.Service অবজেক্টের লিস্টে ম্যাপ হবে
আরও কিছু উদাহরণ দেওয়া হলো
উদাহরণ ১: কাস্টম Mail Configuration
@Component
@ConfigurationProperties(prefix = "mail")
@Setter
@Getter
public class MailConfig {
private String host;
private int port;
private String username;
private String password;
}
application.yml
mail:
host: smtp.gmail.com
port: 587
username: myemail@gmail.com
password: secret123
ব্যবহার:
@Service
@RequiredArgsConstructor
public class EmailService {
private final MailConfig mailConfig;
public void printMailInfo() {
System.out.println("Mail host: " + mailConfig.getHost());
}
}
উদাহরণ ২: List ও Map সহ Configuration
@Component
@ConfigurationProperties(prefix = "app")
@Setter
@Getter
public class AppConfig {
private List<String> admins;
private Map<String, String> endpoints;
}
application.yml
app:
admins:
- maruf
- rihan
endpoints:
user: /api/v1/users
product: /api/v1/products
ব্যবহার:
@Autowired
private AppConfig appConfig;
public void showConfig() {
System.out.println(appConfig.getAdmins());
System.out.println(appConfig.getEndpoints().get("user"));
}
উদাহরণ ৩: Enum ব্যবহার করে Configuration
@Component
@ConfigurationProperties(prefix = "server")
@Setter
@Getter
public class ServerConfig {
private Mode mode;
public enum Mode {
DEV, TEST, PROD
}
}
application.yml
server:
mode: DEV
ব্যবহার:
@Autowired
private ServerConfig serverConfig;
public void checkEnv() {
if (serverConfig.getMode() == ServerConfig.Mode.DEV) {
System.out.println("Running in DEV mode");
}
}
উদাহরণ ৪: Nested Object সহ Configuration (API client setup)
@Component
@ConfigurationProperties(prefix = "external.api")
@Setter
@Getter
public class ExternalApiConfig {
private String baseUrl;
private Auth auth;
@Setter
@Getter
public static class Auth {
private String clientId;
private String clientSecret;
}
}
application.yml
external:
api:
base-url: https://api.example.com
auth:
client-id: abc123
client-secret: xyz789
ব্যবহার:
@Autowired
private ExternalApiConfig config;
public void callApi() {
System.out.println("Base URL: " + config.getBaseUrl());
System.out.println("Client ID: " + config.getAuth().getClientId());
}
উদাহরণ ৫: Validation সহ Configuration
@Component
@ConfigurationProperties(prefix = "storage")
@Validated
@Setter
@Getter
public class StorageConfig {
@NotBlank
private String location;
@Min(1)
@Max(100)
private int maxFiles;
}
application.yml
storage:
location: /data/files
max-files: 10
ব্যবহার:
@Autowired
private StorageConfig storageConfig;
যদি ভুল কনফিগারেশন দেওয়া হয় (যেমন max-files: 0), তাহলে Spring Boot স্টার্টআপেই exception দেবে।