注入配置文件属性值
properties语法
键(key)=值(value)
1
| spring.thymeleaf.cache = false
|
yaml(yml)语法
大小写敏感
key:value
使用空格缩进表示层级
不允许tab键缩进
普通数据
1 2 3 4
| student: name: fengyue age: 20 height: 40
|
or
1
| student: {name: fengyue,age: 20}
|
数组
1 2 3
| friend: - zhangsan - lisi
|
列表
1 2 3 4 5 6 7
| friend: - name: lisi age: 20 - name: zhangsan age: 20
|
注入
@Value
value注解可不写set方法,
不支持松散绑定和JSR303数据验证
不提供复杂数据类型
1 2 3 4 5 6 7 8
| @Component public class Constomer { @Value("${student.name}") private String name; @Value("${student.age}") private int age; }
|
@ConfigruationProperties(prefix=””)
将properties或者yml配置文件转化为bean来使用的
prefix中写入在配置文件中对应的类名
和@Value不同要些set方法
@ConfigurationProperties会自动匹配对应对应的数据
1 2 3 4 5 6 7
| @Component @ConfigurationProperties(prefix="constomer") public class Constomer { private String name; private int age; }
|
获取
@Componet
在类上使用@Componet表示该类是SpringBoot的组件,将此类标记为Spring容器中的一个Bean
spring的组件扫描就会自动发现它,并且会将其初始化为spring应用上下文中的bean
@Autowired
@Autowired可以标注在属性上、方法上和构造器上,来完成自动装配,依赖注入
自定义配置类
@Configuration和@Bean
@Bean表示标记为spring容器中的一个bean
@Configuration,表示定义一个配置类,有@Componet的功能
springboot会自动扫描配置类,可替代spring中的xml配置文件
1 2 3 4 5 6 7
| @Configuration public class AutoProper { @Bean public String name(){ return "fengyue"; } }
|
自定义配置文件
properties的配置方法
springboot会自动使用名称为application的配置文件,当要使用其他名称的配置文件时就要手动配置
@PropertySource()引入自定义配置文件,指定配置文件的位置和名字
@EnableConfigurationProperties(Role.class)表示开启对应配置类的属性注入功能其余功能如下
1、让使用了 @ConfigurationProperties 注解的类生效
2、将该类注入到 IOC 容器中,交由 IOC 容器进行管理
注:在下面的例子中体系不出@EnableConfigurationProperties的作用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| @Configuration @PropertySource("classpath:mytest.properties") @EnableConfigurationProperties(Role.class) @ConfigurationProperties(prefix = "role") public class Role { private String name; private int age;
@Override public String toString() { return "Role{" + "name='" + name + '\'' + ", age=" + age + '}'; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; } }
|
yaml的配置方法
yaml的配置需要新建工厂转换类PropertySourceFactory
1 2 3 4 5 6
| public class MyPropertySourceFactory implements PropertySourceFactory { @Override public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException { return new YamlPropertySourceLoader().load(name,resource.getResource()).get(0); } }
|
接着就是和properties类似的操作
在@ProperySource中需要指定工厂
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| @Configuration @PropertySource(value="classpath:mytest.yaml",factory = MyPropertySourceFactory.class) @EnableConfigurationProperties(Role.class) @ConfigurationProperties(prefix = "role") public class Role { private String name; private int age; @Override public String toString() { return "Role{" + "name='" + name + '\'' + ", age=" + age + '}'; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; } }
|
@Value中的EL表达式
#{}被包裹的数据可以参与运算
1 2
| @Value("#{${user.height} + 10}") private int h;
|
多环境配置
当前使用的时test配置
—该分割线用来分开配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| server: servlet: context-path: /index spring: profiles: active: test ---
server: port: 8081 servlet: context-path: /dev spring: profiles: dev --- server: port: 8081 servlet: context-path: /test spring: profiles: test
|
配置文件之间的优先级
1为最高优先级,优先级依次减低
1.在当前项目目录下的config文件
2.在当前项目目录下
3.在classpath根路径的config目录下
4.在classpath根路径下