[6-02-01].第05节:配置文件 - 读取配置文件的内容
SpringBoot学习大纲
一、读取配置文件的内容:
方式1:@Value注解读取数据:
a.说明:
- SpringBoot 的核心配置文件中,除了使用内置的配置项之外,我们
还可以在自定义配置,然后采用@Value注解注解去读取配置的属性值
- @Value注解可以将
application.properties
/application.yml
文件中的配置信息注入/绑定到java对象的属性上 - 语法格式:@Value(“${key}”)
- @Value注解可以将
b.实现案例:
1、案例1:@Value 注解的使用:
- 1.自定义配置文件:
server.port=9090
server.servlet.context-path=/myboot
school.name=动力节点
school.address=北京大兴区
school.website=www.bjpowernode.com
site=www.bjpowernode.com
- 2.编写controllere:
- 使用
@Value("${key}")
:key 来自 application.properties(yml)
来获取数据
- 使用
package com.bjpowernode.controller;import com.bjpowernode.vo.SchoolInfo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.annotation.Resource;@Controller
public class HelloController {@Value("${server.port}")private Integer port;@Value("${subject[1]}")private Integer qianduan;@Value("${users[1].age}")private Integer qianduan;@Value("${server.servlet.context-path}")private String contextPath;@Value("${school.name}")private String name;@Value("${site}")private String site;@Resourceprivate SchoolInfo info;@RequestMapping("/data")@ResponseBodypublic String queryData(){return name+",site="+site+", 项目的访问地址="+contextPath+",使用的端口="+port;}@RequestMapping("/info")@ResponseBodypublic String queryInfo(){return "SchoolInfo对象=="+info.toString();}
}
2、读取单独属性的值:
方式2:读取配置中的全部数据:
- 1.步骤1:使用
Environment对象封装全部配置信息
- 2.步骤2:
使用Autowired自动装配数据到Environment
二、将配置绑定到bean:
2.1.注解:
注解1:@Value注解
- SpringBoot配置文件中的信息使用
@Value注解
读取配置文件的属性
注解2:@ConfigurationProperties注解
@ConfigurationProperties
注解与@Value
注解配合使用,@ConfigurationProperties指定配置文件中的前缀
注解3:@Component注解和@Configuration注解
- 使用了
@Component注解
进行了标注,来纳入IoC容器的管理。也可以使用另外一个注解@Configuration
,用这个注解将Bean标注为配置类 - 多数情况下我们会选择使用这个注解,因为该Bean对象的属性对应的就是配置文件中的配置信息,因此这个Bean我们也可以将其看做是一个配置类
2.2.语法:
第1步:自定义配置文件:
server.port=9090
server.servlet.context-path=/myboot
school.name=动力节点
school.address=北京大兴区
school.website=www.bjpowernode.com
site=www.bjpowernode.com
第2步:定义实体类
- 1.定义实体类:
SchoolInfo
- 实体类
SchoolInfo
就是被绑定的bean,使用 @ConfigurationProperties注解
,使用prefix属性用来指定前缀,把配置文件中的属性注入 - 这种方式注入的话,就比上面按照字段一个一个的注入要方便很多
- 实体类
package com.bjpowernode.vo;import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@ConfigurationProperties(prefix = "school")
public class SchoolInfo {private String name;private String website;private String address;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getWebsite() {return website;}public void setWebsite(String website) {this.website = website;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "SchoolInfo{" +"name='" + name + '\'' +", website='" + website + '\'' +", address='" + address + '\'' +'}';}
}
第3步:将Bean纳入IOC容器管理:
- 1.添加使用
@Component
注解进行标注,纳入IoC容器的管理。@Component
注解负责创建Bean对象
第4步:创建 SchoolController:
@Controller
public class SchoolController {//创建对象@Resourceprivate SchoolInfo schoolInfo;//接受到myschool请求@RequestMapping("/myschool")@ResponseBodypublic String doSchool(){//对象调方法,结果返回return "学校信息:"+schoolInfo.toString();}
}
第5步:配置提示:
- 1.自定义类绑定的配置提示的问题:这是IDEA不识别配置文件的问题,自定义的类和配置文件绑定一般没有提示
- 2.如果想有提示,需要进行引入依赖,这样就可以解决这个提示的问题;当然不加依赖也不会影响程序的执行;
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><!--表示防止此依赖加载到其他模块--!><optional>true</optional>
</dependency>
- 2.依赖引入后,为了减少加载时间,需要告诉springBoot打包的时候,不要将processor依赖进行打包。所以需要进行以下配置
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId></exclude></excludes></configuration></plugin></plugins></build>
第6步:测试
- 4.执行 Application , 访问浏览器查看数据
2.3.说明:
- 1.配置文件中的
name
、website
等要和bean对象的属性名name
、website
对应上(属性名相同) - 2.bean中的所有属性都提供了
setter
方法,因为底层是通过setter
方法给bean属性赋值的 - 3.bean的属性需要是
非static
的属性
2.4.案例:
案例实现:
- 1.建一个java类,然后
使用@ConfigurationProperties
注解绑定配置信息到封装类中;使用@Component把封装类添加到Spring管理的bean容器中
,否则无法进行属性注入,
===========Person.java===========
package com.jianqun.boot.bean;import lombok.Data;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
/** @author lvjianuqn* @create 2021-10--21:50* @ConfigurationProperties:指定要加载的数据*/@ConfigurationProperties(prefix = "person")
@Component
@Data
@ToString
public class Person {private String userName;private Boolean boss;private Date birth;private Integer age;private Anim pet;private String[] interests;private List<String> animal;private Map<String, Object> score;private Set<Double> salarys;private Map<String, List<Pet>> allPets;
}
- 2.创建配置文件:
application.yml
# yaml表示以上对象
===========application.yml===========
person:userName: zhangsanboss: falsebirth: 2019/12/12 20:12:33age: 18pet: name: tomcatweight: 23.4interests: [篮球,游泳]animal: - jerry- marioscore:english: first: 30second: 40third: 50math: [131,140,148]chinese: {first: 128,second: 136}salarys: [3999,4999.98,5999.99]allPets:sick:- {name: tom}- {name: jerry,weight: 47}health: [{name: mario,weight: 47}]
- 3.创建controller,然后我们在浏览器中进行访问测试
b.案例说明:
- 1.@Component注解可以修改为@Configuration
- 2.当修改为@Configuration注解后,打印这个Bean对象的类名,可以看到代理类相关的提示:
- 可以发现底层实际上创建了
Bean
的代理对象AppBean$$SpringCGLIB
- 可以发现底层实际上创建了
- 3.生成代理对象会影响效率,这里我们不需要使用代理功能,可以通过以下
@Configuration(proxyBeanMethods = false)
配置来取消代理机制
三、yml中的属性引用:
- 1.所谓的属性引用意思就是tempDir中,第一个路径的值和baseDir中的值有关系,会随之变化而变化,所以就用
{}
形式来进行引用: