属性绑定-@EnableConfigurationProperties
SpringBootSpringBoot大约 3 分钟
关于@EnableConfigurationProperties 的常见使用场景
@EnableConfigurationProperties 注解是配合 @ConfigurationProperties 使用的,但是我们知道,在属性类上使用@ConfigurationProperties仅仅只是进行属性绑定的第一步,此时配置文件中的值还没有和属性类绑定生效,而生效的条件是需要将@ConfigurationProperties`标注的属性类加入到 Spring 的容器中
- 其中一种用法就是在
@ConfigurationProperties注解的属性类上加上@Component注解就能将其注册为 Bean - 那么为什么还要提供另一种用法: 在
@EnableConfigurationProperties中添加被@ConfigurationProperties标注的属性类,将其注入到 Spring 容器中? - 场景:SpringBoot 默认只扫描自己主程序所在的包。如果导入第三方包,即使组件上标注了 @Component、@ConfigurationProperties 注解,也没用。因为组件都扫描不进来,此时使用这个注解就可以快速进行属性绑定并把组件注册进容器
所以,使用@EnableConfigurationProperties 常用于集成第三方库或者自定义 starter 开发,并且不依赖于主程序的组件扫描机制
使用案例:
1. appplication.yml 配置
app:
email:
host: smtp.qq.com
port: 587
from: 1223@qq.com
retry-config:
max-attempts: 3
retry-interval: 20002. 定义配置属性类
@ConfigurationProperties(prefix = "app.email")
@Validated // 可以添加校验
public class EmailProperties {
/**
* SMTP服务器地址
*/
@NotEmpty
private String host;
/**
* SMTP服务器端口
*/
@Range(min = 1, max = 65535)
private int port = 25; // 提供默认值
/**
* 发件人邮箱
*/
@Email
private String from;
/**
* 重试配置
*/
private RetryConfig retryConfig = new RetryConfig();
// getter/setter 省略
/**
* 内部静态类,用于嵌套配置
*/
public static class RetryConfig {
private int maxAttempts = 3;
private long retryInterval = 1000;
// getter/setter 省略
}
}3. 配置类:创建配置类来启用属性绑定
@Configuration
@EnableConfigurationProperties(EmailProperties.class)
@RequiredArgsConstructor //使用构造函数的方式注入
public class EmailConfiguration {
private final EmailProperties emailProperties;
@Bean
public EmailService emailService() {
return new EmailService(emailProperties);
}
}4. 使用配置的服务类
@Service
@Slf4j
public class EmailService {
private final EmailProperties properties;
public EmailService(EmailProperties properties) {
this.properties = properties;
}
public void sendEmail(String to, String subject, String content) {
log.info("Sending email using configuration: host={}, port={}",
properties.getHost(), properties.getPort());
// 实现发送邮件逻辑
}
}