1.导入依赖(导入后配置文件有代码提示)
<!--导入配置文件处理器,配置文件进行绑定就会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
如果配置文件乱码可以试试配置这个
2.引入外部配置文件注入到容器组件(如bean的属性值绑定)
1.使用@ConfigurationProperties(prefix = “person”)
流程:1.在bean上标注@ConfigurationProperties(prefix = “person”)
2.将这个bean加入容器 即标注@component
3.在主配置文件编写对应属性的值
/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
* prefix = "person":配置文件中哪个下面的所有属性进行一一映射
*
* 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
*
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String, Object> maps;
private List<Object> lists;
private Dog dog;
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
public Person() {
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Boolean getBoss() {
return boss;
}
public void setBoss(Boolean boss) {
this.boss = boss;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public Map<String, Object> getMaps() {
return maps;
}
public void setMaps(Map<String, Object> maps) {
this.maps = maps;
}
public List<Object> getLists() {
return lists;
}
public void setLists(List<Object> lists) {
this.lists = lists;
}
@Override
public String toString() {
return "Person{" +
"lastName='" + lastName + '\'' +
", age=" + age +
", boss=" + boss +
", birth=" + birth +
", maps=" + maps +
", lists=" + lists +
", dog=" + dog +
'}';
}
}
server:
port: 8088
person:
lastName: haha
age: 18
boss: true
birth: 2077/03/24
maps: {k1: value1,k2: 55,k3: 56}
lists:
- lisi
- zhaoliu
dog:
name: 狗子
person.age=18
person.birth=1222/02/24
person.boss=true
person.last-name=华生
person.lists=a,b,c
person.maps.k1=22
person.maps.k2=33
person.dog.name=狗子
注入属性值的第二种方法:
public class Person {
@Value("${person.lastName}")
private String lastName;
@value("#{2+8}")
private Integer age;
@value("false")
private Boolean boss;
private Date birth;
private Map<String, Object> maps;
private List<Object> lists;
private Dog dog;
@value的使用在前面spring的注解版里面有说到 可以去看看不再赘述了
3.@Value获取值和@ConfigurationProperties获取值比较
@ConfigurationProperties | @Value | |
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
配置文件yml还是properties他们都能获取到值;
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;
如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;
4.配置文件注入值数据校验
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
//lastName必须是邮箱格式
@Email
//@Value("${person.last-name}")
private String lastName;
1.导入依赖(好像说springboot已经引用了,但是我的标红了导入就没了)
2.@Validated
3.@Email使用具体的注解校验规则
5.@PropertySource&@ImportResource
@PropertySource是spring的底层注解,用来引入外部配置文件,在配置类上标注,前面的spring注解版有说到
这里的作用是避免所有的配置都写在配置类里面,太过臃肿,所以你可以新建配置文件,通过这个注解标注在配置类上将配置文件注入容器。
@PropertySource(value = {"classpath:/person.properties"})
@Configuration
public class MyConfigValue {
@Bean
public Person myPerson(){
return new Person();
}
}
注入后使用就直接在bean上面通过@value获取 上面也有说到
@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效;
Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;
想让Spring的配置文件生效,加载进来;@ImportResource标注在一个配置类上
@ImportResource(locations = {"classpath:beans.xml"})
导入Spring的配置文件让其生效
但是springboot推荐使用配置类的方式而不推荐xml配置文件的方式
但是其实我很好奇,因为xml配置文件写sql写配置有一个优点就是解耦甚至说是项目运行时可以替换?应该可以吧 那全注解方式 耦合度不是更高了吗 为什么不建议使用xml呢 不应该两两结合吗
哪位大佬可以解释一下 评论区留言哦 谢谢
配置文件的占位符随机数等操作
person.last-name=张三${random.uuid}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=${person.hello:hello}_dog
person.dog.age=15
张三${random.uuid}:张三拼接一个随机的uuid
${random.int}随机整数
${person.age:18}获取前面age的值 没有就使用默认值18
{person.hello}_dog