在项目构建过程中,为了项目的灵活性和扩展性有时会要求项目中一些属性信息从配置文件中进行读取。为了应对该问题SpringBoot为我们提供了多种从配置文件中读取信息的方式。
本文接下里就对配置信息读取方式进行总结和回顾,接下来将主要介绍如下内容:
- @Value、@PropertySource结合实现配置内容读取
- @ConfigurationProperties、EnableConfigurationProperties结合实现配置内容读取
- 对比两者区别
第一种:@Value方式
对于@Value的使用主要有如下几种方式:
- @Value("#{obj.property}")
- @Value("${property}")
第二个注入的是外部配置文件对应的property,第二个则是SpEL表达式对应的内容。注意二者的不同,#{}里面那个obj代表对象,一般是spring管理的bean。
/**
* @author: yihang
* @description: Configuration对象信息,主要为了演示#{}的用法
* @date: 2021/8/2 20:01
* @parms
* @return
*/
@Data
@Component("configurationBean")
public class Configuration {
private String password = "1233333";
}
/**
* @author: yihang
* @description: UserBean对象信息
* @date: 2021/8/2 20:01
* @parms
* @return
*/
@Data
@Component
@PropertySource(value = "classpath:application.properties")
public class UserBean {
@Value("${imooc.user.name}")
private String username;
@Value("#{configurationBean.password}")
private String password;
}
本憨憨亲身经历:当使用这种方式时,一定要将该对象交由Spring容器进行管理,如果使用new方式进行创建你会发现当你获取想注入的信息时会一直提示无法获取!
第二种:@ConfigurationProperties方式
当我们使用@ConfigurationProperties注解进行配置内容时,此时一般需要结合@EnableConfigurationProperties这个注解来使用.
@ConfigurationProperties用来加载额外的配置文件中特定前缀开头的配置信息,通常前缀信息通过prefix="xxx"来进行指定
@EnableConfigurationProperties用来开启对 @ConfigurationProperties 注解配置 Bean 的支持。
示例代码:
// 配置加载类
@Configuration
@EnableConfigurationProperties(UserDemo.class)
public class Config {
}
@Data
@ConfigurationProperties(prefix = "userdemo.user")
public class UserDemo {
private String userName;
}
// 配置文件中内容 (案例中使用.properties作为配置文件)
userdemo.user.username = lisi
@ConfigurationProperties一些小的注意事项
-
根据 Spring Boot 松散的绑定规则,类的属性名称必须与外部属性的名称匹配即可,比如:lastname和lastName可认为是相匹配
-
类的字段必须有公共 setter 方法
-
@ConfigurationProperties的使用必须被激活
最佳的激活方式:
如下的代码也可以激活@ConfigurationProperties,但一般不推荐这样使用。因为随着配置信息的增多,这样增大了维护系统中变量信息的难度。
@Configuration @EnableConfigurationProperties(User.class) @Data @ConfigurationProperties(prefix = "userdemo.user") public class User { private String userName; }为了提高代码的可维护性,更推荐构建出一个配置信息来保存这些待读取配置的信息的对象信息,为其@Configuration使得其交由Bean管理。同时 使用
@EnableConfigurationProperties激活所有的配置类信息。//统一化管理信息 @Configuration @EnableConfigurationProperties(SecurityProperties.class) public class SecurityCoreConfig { } // 可配置信息的一个集合 @ConfigurationProperties(prefix = "sxu.security") @Data public class SecurityProperties { // 浏览器配置 private BrowserProperties browser = new BrowserProperties(); // 验证码配置信息 private ValidateCodeProperties code = new ValidateCodeProperties(); private SocialProperties social = new SocialProperties(); }
对比@Value和 @ConfigurationProperties
| @ConfigurationProperties | @value | |
|---|---|---|
| 功能 | 批量注入配置文件中的属性 | 一个个指定 |
| 松散绑定(松散语法) | 支持 | 不支持 |
| SpEL | 不支持 | 支持 |
| JSR303数据校验 | 支持 | 不支持 |
| 复杂类型封装 | 支持 | 不支持 |
总之:如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;
最后强调:无论那种方式都需要将对象信息注入到容器中进行管理,使用时也不能使用new关键来进行构建,一般使用@Autowire注解来实现对象信息的自动注入.