全局配置文件 可以对一些默认配置值进行修改。spring boot使用application.properties 或者 application.yaml 作为全局配置文件。=> 定义spring boot项目的相关属性,包括:系统属性、环境变量、命令参数等信息,也可以是自定义配置文件名称和位置。
用spring initializr构建项目时,会在src/main/resources目录下自动生成application.properties,并在项目启动时自动加载该配置文件
在主程序启动类所在的包下,创建domain(装实体类的包),里面创建两个实体类:Pet和Person
编写Pet类
package com.wpz.chapter02.domain;
/**
* @author 王胖子
* @version 1.0
* 普通实体类:为了给Person类使用
*/
public class Pet {
private String type;
private String name;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Pet{" +
"type='" + type + '\'' +
", name='" + name + '\'' +
'}';
}
}
编写Person类
- 需求:在配置文件中自定义属性值 注入到 Person实体类的属性中
- 步骤:
①@Component
:把Person类作为Spring容器的组件。
& 目的:让spring boot可以自动扫描到该组件,然后对该组件进行其它功能的实现(比如:属性被@ConfigurationProperties注解赋值)
& 说明:除了@Component
,还可以使用@Configuration、@Controller、@Service、@Repository
等
②ConfigurationProperties(prefix="person")
目的:将配置文件中以person开头的key的value值 通过setter()方法 注入到 实体类对应的属性中
package com.wpz.chapter02.domain;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* @author 王胖子
* @version 1.0
* 1. 需求:在配置文件中自定义属性值 注入到 Person实体类的属性中
* 2. 步骤:
* ① @Component:把Person类作为Spring容器的组件。
* 目的:让spring boot可以自动扫描到该组件,然后对该组件进行其它功能的实现(比如:属性被@ConfigurationProperties注解赋值)
* 说明:除了@Component,还可以使用@Configuration、@Controller、@Service、@Repository等
* ② ConfigurationProperties(prefix="person")
* 目的:将配置文件中以person开头的key的value值 通过setter()方法 注入到 实体类对应的属性中
*/
//把Person类作为组件加入spring容器
@Component
//配置:通过配置文件给Person类的属性赋值
@ConfigurationProperties(prefix = "person")
public class Person {
private int id;
private String name;
private List<String> hobby;//爱好
private String[] family;//家庭成员
private Map<String, String> map;
private Pet pet;//宠物
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getHobby() {
return hobby;
}
public void setHobby(List<String> hobby) {
this.hobby = hobby;
}
public String[] getFamily() {
return family;
}
public void setFamily(String[] family) {
this.family = family;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public Pet getPet() {
return pet;
}
public void setPet(Pet pet) {
this.pet = pet;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", hobby=" + hobby +
", family=" + Arrays.toString(family) +
", map=" + map +
", pet=" + pet +
'}';
}
}
在pom.xml中编写后,需要重新运行项目启动类,或者按Ctrl+f9重构当前项目
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-configuration-processorartifactId>
<optional>trueoptional>
dependency>
打开src/main/resouces/application.properties
#对实体类对象Person进行属性值配置
#字符串不需要额外加双引号
person.id=1
person.name=wpz
person.hobby=play,read,sleep
person.family=father,mother,sister
person.map.k1=v1
person.map.k2=v2
person.pet.type=cat
person.pet.name=mimi
package com.wpz.chapter02;
import com.wpz.chapter02.domain.Person;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class Chapter02ApplicationTests {
@Autowired
private Person person;//通过@Autowired注入
@Test
void contextLoads() {
System.out.println(person);
}
}
YAML文件格式是springboot支持的一种json超集文件格式,以数据为核心,是一种更直观且容易被计算机识别的数据序列化格式。=> 更简洁方便
yaml文件配置属性的格式:key:(空格)value,使用缩进控制层级关系,对于String类型的属性值,不需要额外添加双引号
① 普通数据类型(数字、字符串、布尔等)
server:
port:8081
path:/hello
② 数组和单列集合
有两种写法:缩进式和行内式
- 其中缩进式又有两种表示形式:
①"-(空格)属性值"
② 直接赋值并使用英文逗号隔开属性值
缩进式
#person为前缀,对person对象内的hobby赋值
person:
hobby:
- play
- read
- sleep
或者
person:
hobby:
play,
read,
sleep
行内式(对缩进式进行简化) => [ ]可以省略
person:
hobby:[play,read,sleep]
③ Map集合和对象
缩进式
person:
map:
k1:v1
k2:v2
行内式 => 属性值用{ }包住
person:
map:{k1:v1,k2:v2}
还是引用前面的代码,使用前面的两个实体类和测试类
注意: 要将前面application.properties内容注释掉,因为application.properties的优先级高于application.yaml
在resources中新建application.yaml
编写yaml文件
#person为前缀,对person对象内的hobby赋值
person:
id: 2
name: 王胖子
hobby: [sing,read,sleep]
family: [father,mother]
map: {k1:v1,k2:v2}
pet: {type:cat,name:zhuzhu}
如果配置的属性是spring boot默认提供的属性,则spring boot会自动扫描并读取属性值
如果配置的属性是用户自定义的属性,则需要
①通过注解使类成为spring容器的组件:让springboot能扫描到该类
②再通过注解,来从配置文件中读取该类需要的属性值,然后注入到类的属性中
介绍:快速方便的将配置文件中自定义属性值批量注入某个Bean对象的多个对用属性中
三个必须:①@Component(或者其它) ②@ConfigurationProperties(prefix = “person”) ③setter()方法
保证:配置文件中的属性与对应实体类的属性名一致,否则无法正确获取并注入属性值
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private int id;
//setter()方法
public void setId(int id) {
this.id = id;
}
}
@Component
public class Person {
@Value("${person.id}")
private int id;
//省略toString()=>为了测试输出结果
}
对比点 | @ComponentProperties | @Value |
---|---|---|
底层框架 | spring boot | spring |
功能 | 批量注入配置文件中的属性 | 单个注入 |
setter() | Y | N |
复杂属性注入 | Y | N |
松散绑定 | Y | N |
JSR303数据校验 | Y | N |
spEL表达式 | N | Y |
解读:
person.firstName
= person.first-Name
= person.first_Name
person.FIRST_NAME(常量)
@Component
@ConfigurationProperties(prefix = "person")
//进行数据校验:引入spring框架支持的数据校验规则
@Validated
public class Person {
//对属性进行规则匹配:邮件规则校验
@Email
private String email;
//setter()方法
public void setEmail(String email) {
this.email = email;
}
}
@Value("#{5*2}")
private int id;
spring boot会在启动时自动加载全局配置文件,但是spring boot无法识别我们自定义的配置文件,这时就需要我们手动加载了。
使用
@PropertySource+@Configuration+@EnableConfigurationProperties)
注解加载自定义配置文件
@Configuration
:
标记当前类为自定义配置类,该类会作为Bean添加到spring容器中,这里等同于@Component@PropertySource
:
指定自定义配置文件的位置和名称
@PropertySource("classpath:test.properties")
@ConfigurationProperties
:将配置文件中以test开头的属性值注入到配置类的属性中
@ConfigurationProperties(prefix = "test")
- @EnableConfigurationProperties(MyProperties.class):
开启配置类MyProperties的属性注入功能,该注解配合@Configuration使用,
使用@Component时,可以省略这个注解
@EnableConfigurationProperties(MyProperties.class)
package com.wpz.chapter02.domain;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
//@Configuration:标记当前类为自定义配置类,该类会作为Bean添加到spring容器中,这里等同于@Component
@Configuration
//@PropertySource:指定自定义配置文件的位置和名称
@PropertySource("classpath:test.properties")
//@ConfigurationProperties:将配置文件中以test开头的属性值注入到配置类的属性中
@ConfigurationProperties(prefix = "test")
//@EnableConfigurationProperties(MyProperties.class):开启配置类MyProperties的属性注入功能,该注解配合@Configuration使用,
// 使用@Component时,可以省略这个注解
@EnableConfigurationProperties(MyProperties.class)
public class MyProperties {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "MyProperties{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
test.id=1
test.name=test
package com.wpz.chapter02;
import com.wpz.chapter02.domain.MyProperties;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class Chapter02ApplicationTests {
@Autowired
private MyProperties myProperties;
@Test
void myPropertiesTest(){
System.out.println(myProperties);
}
}
由于这个只在特殊情况下使用,一般使用配置类代替,所以这里简单介绍它的使用方式就好了
- 前提:
spring boot中默认不再使用xml配置文件,且xml配置文件不会加载到spring容器中。- 那如何将xml文件加载到项目中?
使用 @ImportResource加载xml配置文件 或者 使用 @Configuration编写自定义配置类
模拟一下,不写代码
需求:用xml文件将MyService类作为组件加入到spring容器
注意:@ImportResource
注解要加在主程序启动类上
① 写一个类MyService,里面什么都不写
② 编写xml文件,将MyService类作为组件加入到spring容器
<bean id="myService" class="XXX.XXX.XXX.MyService"/>
③ 在主程序启动类上面加@ImportResource
:因为springboot不会自动加载xml文件到spring容器中,所以需要注解来加载xml配置文件
④ 编写测试方法,测试容器中是否包含id为"myService"的组件=>测试结果为true
//用@Autowired注入了applicationContext对象
System.out.println(applicationContext.containsBean(myService));
- 用自定义配置类来实现@ImportResource中的案例,将类作为组件加入Spring容器
- 需求:用MyConfig自定义配置类 来实现 将MyService类作为组件加入到spring容器中 => 用自定义配置类代替xml文件
- 解读:
① 用@Configuration
声明的MyConfig自定义配置类 类似与声明了一个xml配置文件,且能被spring boot自动扫描识别(相当于@ImportProperties加载xml文件,使springboot能够扫描到引入的xml文件)
②@Bean
注解的myService()方法,其返回值对象作为组件添加到spring容器中,方法名为组件id(类似与XMl配置文件中的)
- 概括:
@Configuration替代引入xml文件
@Bean替代xml文件中的内容
在chapter02项目代码的基础上,创建MyConfig类和MyService类
MyService类什么都不写
编写配置类
@Configuration+@Bean编写自定义配置类
package com.wpz.chapter02.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//使用@Configuration将MyConfig类声明为一个配置类
@Configuration
public class MyConfig {
//配置类中的@Bean注解标注的方法
//- 方法返回值:返回值对象作为Bean组件注入spring容器
//- 方法名:组件的组件名(id)
@Bean
public MyService myService() {
return new MyService();
}
}
注意ApplicationContext导入的包:import org.springframework.context.ApplicationContext;
package com.wpz.chapter02;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
@SpringBootTest
class Chapter02ApplicationTests {
@Autowired
private ApplicationContext applicationContext;
@Test
void myConfigTest() {
//判断spring容器中是否有id为myService的组件
System.out.println(applicationContext.containsBean("myService"));
}
}