有时候,我们希望从配置文件中获取一系列配置信息,除了使用 @Value 注解外,还有一种更好的方式,就是使用 @ConfigurationProperties 注解。
比如,假设在配置文件中存在如下 OSS 配置信息:
spring:oss:enable: truebucket-name: local
我们可以在对应的实体类上,使用 @ConfigurationProperties 注解,并指定前缀为 spring.oss,如下:
@Data
@ConfigurationProperties(prefix = "spring.oss")
public class FileProperties {private Boolean enable;/*** 默认的存储桶名称*/private String bucketName = "local";
}
这样,我们就可以很方便的获取到配置文件中的配置信息,而无需使用 @Value 注解。
但是,仅用 @ConfigurationProperties 注解,并不能将配置文件中的配置信息注入到对应的实体类中,也无法从容器中获取到对应的实体类,还需要使用
@EnableConfigurationProperties 注解,如下:
@Configuration
@EnableConfigurationProperties(FileProperties.class)
public class OssAutoConfiguration {
}
也可以在加了 @ConfigurationProperties 注解的类上加上 @Component 注解,能达到 @EnableConfigurationProperties 注解相同的效果。
之后,需要用到相关配置信息时,可直接从容器中获取:
@Component
public class OssService {@Autowiredprivate FileProperties fileProperties;
}
所以 @EnableConfigurationProperties 注解的作用是:使使用 @ConfigurationProperties 注解的类生效。
另外,如果存在嵌套的配置信息,比如:
spring:oss:enable: truebucket-name: localaliyun:endpoint: oss-cn-beijing.aliyuncs.comaccess-key: xxxsecret-key: xxxbucket-name: localregion: cn-beijing
则在实体类中,使用 @NestedConfigurationProperty 注解,如下:
@Data
@ConfigurationProperties(prefix = "spring.oss")
public class FileProperties {private Boolean enable;private String bucketName = "local";@NestedConfigurationPropertyprivate AliyunFileProperties aliyun;
}
@Data
public class AliyunFileProperties {private String endpoint;private String accessKey;private String secretKey;private String bucketName;private String region;
}
参考:关与 @EnableConfigurationProperties 注解