SpringBoot的配置信息一般是直接写在默认的配置文件(application.yml/application.properties)中的,SpringBoot自动装配的时候会加载这些数据,我们可以直接使用。但还有些情况下,我们的配置信息不放在默认的配置文件中,就需要用另外的方法来读取和使用了。
1. 默认配置文件中的信息
写在默认的配置文件(application.yml/application.properties)中的数据信息我们可以直接使用,使用方法我知道的有3种。
1.1 使用@Value
注解
需要的数据比较少时,用起来比较方便,可以随时加
public class Test {
// 读取字符串
@Value("${server.ip}")
private String ip;
// 读取整型
@Value("${server.port}")
private Integer port;
// 属性不存在时(不包括值为空),设置默认值
@Value("${server.password:123456}")
private String password;
public void test1() {
System.out.println("server.ip= "+ip);
System.out.println("server.port= "+port);
System.out.println("server.password= "+password);
}
}
注意:@Value 并不是所有的Spring 管理范围内都能使用,是由于它的实现机制决定的,它是AutowiredAnnotationBeanPostProcessor 实现的,它是BeanPostProcessor 接口的实现类,所以在任何BeanPostProcessor 和BeanFactoryPostProcessor 的子类中都不能使用@Value 注入属性,因为那时@Value 还未被处理
1.2 通过Environment
Environment
是Spring通用的配置读取类,可以读取application.properties, application.yml ,命令行输入参数、系统属性、操作系统环境变量,可以通过Spring 容器自动注入,可以使用如下:
@Configuration
public class EnvConfig{
@Autowired
private Environment env;
public int getProperties() {
return env.getProperty("com.foo", Integer.class);
}
}
Environment 是SpringBoot 最早初始化的一个类,因此可以使用在Spring 的任何地方
1.3 使用@ConfigurationProperties
注解
@ConfigurationProperties是SpringBoot加入的注解,主要用于配置文件中的指定键值对映射到一个Java实体类上,一般数据信息多时,用起来方便,使用时请注意以下几点:
- 需要添加
spring-boot-configuration-processor
包 - 前缀定义了哪些外部属性将绑定到类的字段上
- 根据 SpringBoot 宽松的绑定规则,类的属性名称必须与外部属性的名称匹配
如以下信息都将绑定到hostName属性上mail.hostName = localhost mail.hostname = localhost mail.host_name = localhost mail.host-name = localhost mail.HOSTNAME = localhost
- 我们可以简单地用一个值初始化一个字段来定义一个默认值
- 类的字段必须有公共 getter、setter 方法
-
@ConfigurationProperties
有3种使用场景:- 第1种:
@ConfigurationProperties
和@Component
注解一起用到一个bean类上,使用时用@Resource
先注入,如下:
yml
java类spring: test: overTimeType: 123
@ConfigurationProperties(prefix = "spring.test", ignoreUnknownFields = true) @Data @Component public class RuleTypeproperties { private String overTimeType; }
- 第2种:
@ConfigurationProperties
和@Bean
注解一起用到一个方法上
/** * @ConditionalOnProperty一般加在@Configurarion、@Component配置的类上或@Bean配置的方法上, * 表示满足获取到某些配置文件信息后才会配置或加载。 * havingValue可与name组合使用:比较name获取到的属性值与havingValue给定的值是否相同,相同才加载配置 */ @Bean @ConfigurationProperties("spring.datasource.druid.slave") @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true") public DataSource slaveDataSource() { return DruidDataSourceBuilder.create().build(); }
- 第3种:使用
@ConfigurationProperties
注解到普通类,在使用的类上通过@EnableConfigurationProperties
定义为Bean
这里User对象并没有使用@Component相关注解。而该User类对应的使用形式如下:@ConfigurationProperties(prefix = "user1") @Data public class User { private String name; }
上述代码中,通过@SpringBootApplication @EnableConfigurationProperties({User.class}) public class Application { public static void main(String[] args) throws Exception { SpringApplication.run(Application.class, args); } }
@EnableConfigurationProperties
对User
进行实例化时,便会使用到@ConfigurationProperties
的功能,对属性进行匹配赋值。 - 第1种:
注意:
- 当我们为属性配置错误的值时,而又不希望 Spring Boot 应用启动失败,我们可以设置 ignoreInvalidFields 属性为 true (默认为 false)
- ignoreUnknownFields 默认值是false,即当yml文件中出现了多余的字段不会报错,例子中改为了true
2. 指定的配置文件的读取
@PropertySource用于读取指定的配置文件,但注意这个注解默认是不支持加载YML文件,一般用properties文件。
它包含的属性解释 :
1.value:指明加载配置文件的路径。
2.ignoreResourceNotFound:指定的配置文件不存在是否报错,默认是false。当设置为 true 时,若该文件不存在,程序不会报错。实际项目开发中,最好设置 ignoreResourceNotFound 为 false。
3.encoding:指定读取属性文件所使用的编码,我们通常使用的是UTF-8。
简单示例:
@Component
@ConfigurationProperties(prefix = "author")
@PropertySource(value = {"classpath:config/authorSetting.properties"},
ignoreResourceNotFound = false, encoding = "UTF-8")
public class AuthorTest {
private String name;
private int age;
}
3. 另外的
经常使用hutool,这个工具中有Hutool-setting
,使用起来也挺好的,为什么不想用@PropertySource
,可能是因为经常在不经意间 中文注释 就乱码了吧,恶心