上篇简单了解了SpringBoot的概念并学会如何搭建一个SpringBoot项目,今天就来学习SpringBoot的配置文件的种类与用法
前景引入
在学习SpringBoot之前,SSM项目的配置复杂程度堪称配置地狱,一开始开发者就对Spring、SpringMVC、Mybatis、tomcat进行配置,这浪费了我们大量的时间去构建项目,而且如果配置一旦出现错误,项目就有可能崩溃。
SpringBoot采用了自动配置,以前需要配置的东西,Spring Boot帮我们自动配置,使得开发者更加关注于业务代码的开发
什么是SpringBoot自动配置?
-
指的是基于你引入依赖的jar包,对SpringBoot应用自动配置
-
它为SpingBoot框架“开箱即用”提供了基础支撑
使用过SpringBoot的都知道启动类中使用了@SpringBootApplicatin注解,打开源码我们查看一下元注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {
@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
@AliasFor(
annotation = EnableAutoConfiguration.class
)
Class<?>[] exclude() default {};
@AliasFor(
annotation = EnableAutoConfiguration.class
)
String[] excludeName() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackages"
)
String[] scanBasePackages() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackageClasses"
)
Class<?>[] scanBasePackageClasses() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "nameGenerator"
)
Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
@AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods() default true;
}
我们主要关注三个元注解,分别为@SpringBootConfiguration、@E nableAutoConfiguration、@ComponentScan
1、@SpringBootApplication修饰的类,也会被@Configuration间接修饰,即“源配置类”
2、SpringBoot框架会对“源配置类”所在的package进行组件扫描
3、SpringBoot框架最终会导入AutoConfigurationImportSelector来实现自动配置
配置文件分类
-
SpringBoot提供了两种能被识别的配置文件,分别为properties和yaml/yml文件
-
在同一级目录下优先级为:properties > yml > yaml
-
默认配置文件名称:application
yml/yaml文件类型
概念: YML文件格式是YAML (YAML Aint Markup Language)编写的文件格式,YAML是一种直观的能够被电脑识别的的数据数据序列化格 式,并且容易被人类阅读,也容易和脚本语言交互
语法与特点:
-
大小写铭感
-
数据值前边必须有空格,作为分隔符
-
使用缩进表示层级关系
-
缩进时不允许使用Tab键,只允许使用空格(各个系统Tab对应的空格数目可能不同,导致层次混乱)
-
缩进的空格数目不重要,只要相同级的元素左侧对齐即可
示例:以定义服务器端口和主机为例
server
port: 8080
address: 127.0.0.1
数据类型定义
对象(map)
person:
name: zhangsan
#行内写法
person: {name: zhangsan}
数组(array)
address:
- beijing
- shangsai
# 行内写法
address: {beijing,shanghai}
常量
msg1: 'hello \n world' #单引忽略转义字符
msg2: "hello \n world" #双引识别转义字符
同类比较
下面我们将yml与properties和xml文件格式进行比较
-
xml
<server>
<port>8080</port>
<address>127.0.0.1</address>
</server>
-
properties
server.port=8080
server.address=127.0.0.1
-
yml
server
port: 8080
address: 127.0.0.1
区别:
1、xml文件主要是树形结构,xml配置文件结构清晰,但是内容比较繁琐
2、properties文件主要是以key-value键值对的形式存在,文件结构简单,但难以表达层次
3、yml文件不是一种标记语言,但容易表现层级关系,而且语法简洁精炼
获取配置文件数据
SpringBoot提供了以下三个注解来获取配置文件数据
@Value
@Environment
@ConfigurationProperties
-
第一种方式,使用@Value yml文件
user1:
name: zhangsan
1、Controller层,获取对象数据(user1.name)
@Controller
public class HelloController {
@Value("${user1.name}")
private String name;
@ResponseBody
@RequestMapping("/param")
public String hello(){
System.out.println(name);
return "param";
}
}
2、获取数组数据
yml文件:
country: [China,Italy]
Controller测试
@Controller
public class HelloController {
@Value("${user1.name}")
private String name;
@Value("${country[0]}")
private String country1;
@ResponseBody
@RequestMapping("/param")
public String hello(){
System.out.println("country1 : "+country1);
return "param";
}
}
-
第二种方式,使用Environment对象获取数据,这个方法比较方便
在Controller层,创建Environment对象,并自动注入,然后使用对象的getProperty方法获取数据
@RestController
public class Test1Controller {
@Autowired
Environment env;
@RequestMapping("/test1")
public String test1(){
System.out.println("country[0] : "+env.getProperty("country[0]"));
System.out.println("user1.name : " + env.getProperty("user1.name"));
return "test1";
}
}
输出如下:
country[0] : China
user1.name : zhangsan
-
方式三:使用@ConfigurationProperties获取数据
首先创建一个Bean,加上@ConfigurationProperties注解,还有一定要加上prefix前缀
注意:Bean成员一定要跟yml的数据一一对应
@Component
@ConfigurationProperties(prefix = "admin")
public class Admin {
private String userName;
private String password;
private String[] hobby;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password=password;
}
public String[] getHobby() {
return hobby;
}
public void setHobby(String[] hobby) {
this.hobby = hobby;
}
@Override
public String toString() {
return "Admin{" +
"userName='" + userName + '\'' +
", password='" + password + '\'' +
", hobby=" + Arrays.toString(hobby) +
'}';
}
}
然后在Controller层,创建一个Admin对象,并自动注入
@RestController
public class Test1Controller {
@Autowired
private Admin admin;
@RequestMapping("/test2")
public String test2(){
System.out.println("userName: "+admin.getUserName());
System.out.println("password: "+admin.getPassword());
for (String hobby : admin.getHobby()) {
System.out.println(hobby);
}
return "test2";
}
}
输出:
userName: admin
password: 123
music
play game
至此,本篇内容结束,如果你喜欢本篇,欢迎点赞+关注,前方不迷路,祝各位生活愉快!