全局配置文件
- application.properties 配置文件
先准备两个pojo实体类Pet和Person
@Component//用于将Person类作为Bean注入到spring容器中
@ConfigurationProperties(prefix = "person") //将配置文件中以person开头的属性注入到该类中
public class Person {
private int id; //id
private String name; //名称
private List hobby; //爱好
private String[] family; //家庭成员
private Map map;
private Pet pet; //宠物
//getter setter toString方法省略
@ConfigurationProperties(prefix = “person”)注解的作用就是将配置文件中的以person开头的属性值通过setXX()方法注入到实体类对应的属性中。
@Component注解的作用是将当前注入属性值的Person类对象作为Bean组件放入到Spring容器中,只有这样才能被@ConfigurationProperties注解进行赋值。
在resource目录下的application.properties配置文件,在该配置文件中编写需要对Person类设置的属性,如下
person.id=1
person.name=tom
person.hobby=吃饭,睡觉,打豆豆
person.family=father,mother
person.map.k1=v1
person.map.k2=v2
person.pet.type=dog
person.pet.name=旺财
编写application.properties配置文件时,由于要配置Person对象属性是我们自定义的,Spring Boot无法自动识别,所以不会有任何书写提示。在实际开发中,为了出现代码提示的效果来方便配置,在使用@ConfigurationProperties注解进行配置文件属性值注入时,可在pom.xml中添加一个Spring Boot提供的配置处理器依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
在pom.xml中添加上述配置依赖后,还需要重新运行项目启动类或者使用“Ctrl+F9”快捷键(即Build Project)重构当前Spring Boot项目方可生效
打印结果
Person{id=1, name=‘tom’, hobby=[吃饭, 睡觉, 打豆豆], family=[father, mother], map={k1=v1, k2=v2}, pet=Pet{type=‘dog’, name=‘旺财’}}
可以看出,测试方法configurationTest()运行成功,同时正确打印出了Person实体类对象,至此,说明application.properties配置文件属性配置正确,并通过相关注解自动完成了属性注入。
- application.yaml 配置文件
- value值为普通数据类型
person:
id: 2
name: lucy
- value值为数组和单列集合,主要有两种书写格式:缩进式、行内式
#缩进式,如下两种都可以
person:
hobby:
- 吃饭
- 睡觉
- 打豆豆
person:
hobby:
吃饭,
睡觉,
打豆豆
#行内式
person:
hobby: [吃饭,睡觉,打豆豆]
- value值为map集合和对象
#缩进式
person:
map:
k1: v1
k2: v2
#行内式
person:
map: {k1: v1,k2: v2}
需要注意的一点是application.properties会覆盖application.yaml同样的配置
配置文件属性值的注入
- 使用@ConfigurationProperties注入属性
//用于将Person类作为Bean注入到spring容器中
@Component
//将配置文件中以person开头的属性注入到该类中
@ConfigurationProperties(prefix = "person")
public class Person {
private int id;
public void setId(int id) {
this.id = id;
}
}
@ConfigurationProperties(prefix = “person”) 表示配置文件中的属性以person开头
- 使用@Value注入属性
@Component
public class Person {
@Value("${person.id}")
private int id;
@Value("${person.name}")
private String name;
@Value("北京")
private String address;
}
@Value不仅可以将配置文件中的属性注入person的id属性,还可以直接赋值,@ConfigurationProperties不支持。另外使用@Value注解方式需要对每一个属性注入设置,但是不需要写属性setXX()的方法。
自定义配置
- 使用 @PropertySource加载配置文件
加载自定义配置文件的需求,可以通过使用@PropertySource注解结合@Configuration注解配置类的方式实现。@PropertySource注解用于指定自定义配置文件的位置和名称。同时,为了保证springboot能够扫描到,还需要在类上添加@Configuration注解来表明这是一个配置类。
- 在项目路径下新建test.properties配置文件,在配置文件中编写需要设置的属性
test.id=1
test.name=test
- 自定义配置类
@Configuration
@PropertySource("classpath:test.properties") //配置自定义配置文件的名称及位置
@EnableConfigurationProperties(MyProperties.class) //
@ConfigurationProperties(prefix = "test")
public class MyProperties {
private int id;
private String name;
//省略getXX()和setXX()方法
}
- @Configuration注解表示当前类是一个自定义配置类,这里也可以使用传统的@Component注解
- @PropertySource(“classpath:test.properties”) 注解指定了自定义配置文件的位置和名称
- @ConfigurationProperties(prefix = “test”)注解将上述自定义配置文件test.properties中以person开头的属性值注入到该配置类属性中
- 如果配置类上使用的是@Component注解而非@Configuration注解,@EnableConfigurationProperties注解可以省略
- 测试
//测试启动器,并加载spring boot测试注解
@RunWith(SpringRunner.class)
//标记该类为spring boot单元测试类,并加载项目的applicationContext上下文环境
@SpringBootTest
class Springboot01DemoApplicationTests {
/*
@propertySource进行测试
*/
@Autowired
private MyProperties myProperties;
@Test
void myPropertiesTest() {
System.out.println(myProperties);
}
}
测试结果:MyProperties{id=1, name=‘test’}
- 使用@Configuration编写自定义配置类
- 在springboot框架中,推荐使用配置类的方式向容器中添加和配置组件,通常使用@Configuration注解定义一个配置类,springboot会自动扫描和识别配置类,从而替换传统spring框架中的XML配置文件
- 当定义一个配置类后,还需要在类的方法上添加@Bean注解进行组件配置,将方法的返回值对象注入到spring容器中,并且组件名称默认使用的方法名,也可以使用@Bean的name或者value属性自定义组件名称。
- 自定义一个bean类
public class MyService {
}
- 自定义一个配置类
//标明该类为配置类
@Configuration
public class MyConfig {
//将返回值对象作为组件添加到spring容器中,标识id默认是方法名
@Bean(name = "iservice")
public MyService myService() {
return new MyService();
}
}
- 测试
//测试启动器,并加载spring boot测试注解
@RunWith(SpringRunner.class)
//标记该类为spring boot单元测试类,并加载项目的applicationContext上下文环境
@SpringBootTest
class Springboot01DemoApplicationTests {
@Autowired
private ApplicationContext context;
@Test
void iocTest() {
System.out.println(context.containsBean("iservice"));
}
}
测试结果返回true,表示容器中包含id 为iservice的实例对象组件,说明使用自定义配置类成功向spring容器添加和配置了组件
随机参数设置和参数间引用
- 随机参数配置
在springboot配置文件中,随机值设置使用springboo内嵌的RandomValuePropertySource类,对一些隐秘属性值或者测试用例属性值进行随机值注入,具体用法如下
#随机值
my.secret=${random.value}
#随机整数
my.number=${random.int}
#随机长整形
my.bignumber=${random.long}
#随机UUID
my.uuid=${random.uuid}
#小于10的随机整数
my.number.less.than.ten=${random.int(10)}
#范围在[1024,65536]之间的随机整数
my.number.in.range=${random.int[1024,65536]}
- 参数间引用
- 在springboot配置文件中,配置文件的属性值还可以进行参数间的引用,也就是在后一个配置的属性值中直接引用先前已经定义过的属性,这样可以直接其中的属性值。
- 优点:在多个具有互相关联的配置属性中,只需要修改一处属性预先配置,其他地方都可以引用,省去了后续多出修改的麻烦。参数间引用的语法格式为${xx},xx表示先前在配置文件已经配置过的属性名,具体用法如下
#随机值设置及参数间引用
tom.age=${random.int[10,20]}
tom.description=tom的年龄可能是${tom.age}