SpringBoot之旅第二篇-配置
一、引言
虽然springboot帮我们进行了自动配置,但配置还是不可避免的,比如最简单的端口号,数据库连接。但springboot的配置一般不用xml进行配置,而是yml和properties,选择他们当然是因为他们更方便。
YAML(YAML Ain't Markup Language)是以数据为中心的,所以比xml和json更适合做配置文件,我们看一个简单例子:配端口号
yaml的写法是:
server:
port:
xml的写法是:
<server>
<port>8081</port>
</server>
直观上我们就能看到yaml的写法更简练,xml用了很大的空间放在标签的开闭上,而yaml不需要,下面我们来细讲yaml的语法。
二、YAML语法
yaml的基本语法是 k:(空格)v:表示一对键值对(空格必须有),以空格的缩进来控制层级关系,只要是左对齐的一列数据,都是同一个层级的。且属性和值都是大小写敏感的。如:
server:
port: 8081
path: /hello
我们重点看看值的写法,值的写法是指可以用哪些写法来写值,一般有:字面量,对象、Map,数组。
字面量:就是指普通的值(数字,字符串,布尔),这个写法就是直接k: v:方式,字符串默认不用加上单引号或者双引号,如果加了,那双引号和单引号是有区别的,区别在于是不是转义特殊字符,双引号会转义特殊字符,而单引号不会。如:
name: "yuanqinnan \n yuanyuan" 输出;yuanqinnan 换行 yuanyuan
name: ‘yuanqinnan \n yuanyuan’:输出;yuanqinnan \n yuanyuan
对象、Map的写法也是普通的k: v 写法,在下一行来写对象的属性和值的关系。如
friends:
lastName: zhangsan
age: 20
也可以一行完成
friends: {lastName: zhangsan,age: 18}
数组(List、Set)
用- 值表示数组中的一个元素,如:
pets:
- cat
- dog
- pig
记得- 后要打空格,这也有一行写法:
pets: [cat,dog,pig]
三、配置文件注入
配置文件写完,那么我们就要来使用了,下面讲配置文件值注入。
第一种方式@ConfigurationProperties
新建一个person类
/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
* prefix = "person":配置文件中哪个下面的所有属性进行一一映射
*
* 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
*
*/
@Component
@ConfigurationProperties(prefix = "person")
@Data
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;
}
这里为了少些一些代码,引入lombok,增加依赖,这个不清楚的同学自行百度了。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
</dependency>
再建一个dog类:
@Data
public class Dog {
private String name;
private Integer age;
}
然后在配置文件中加入以下配置:
server:
port: 8089
person:
lastName: hello
age: 18
boss: false
birth: 2017/12/12
maps: {k1: v1,k2: 12}
lists:
- lisi
- zhaoliu
dog:
name: 小狗
age: 12
这里基本包含了我们需要的各种类型,直接在SpringbootLearnApplicationTests测试:

测试结果:

除了可以一次性注入之外,还有另一种注入方式@Value ,@Value支持字面量,${key}从环境变量、配置文件中获取值,支持#{Spel}表达式,怎么写呢?例子:
//支持${}
@Value("${person.lastName}")
private String lastName;
//支持#{SpEL}
@Value("#{10*2}")
private Integer age;
//支持字面量
@Value("true")
两者有以下的区别:

@ConfigurationProperties默认从主配置文件中获取值,如果需要专门的配置文件则需要使用@PropertySource ,写法如下:
@PropertySource(value = {"XXX"})
我们应该怎么选择两种注入方式呢?
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value。
如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties。
这里还要注意Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,不能自动识别,什么意思呢?
如我们新建一个xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="helloService" class="com.yuanqinnan.service.HelloService"></bean>
</beans>
按照路径添加HelloService类,然后我们直接去获取bean,看看能不能取出来
测试方法:
@Autowired
ApplicationContext ioc;
@Test
public void beanTest(){
boolean b = ioc.containsBean("helloService");
System.out.println(b);
}
结果是false,说明没有注入成功,这个时候我们需要使用@ImportResource在启动类上加上
@ImportResource(locations = {"classpath:beans.xml"})
这样才能注入进来,因为springboot是不推荐使用xml文件而使用注解方式,我们一般这么写
@Configuration
public class MyAppConfig { //将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名
@Bean
public HelloService helloService2(){
System.out.println("配置类@Bean给容器中添加组件了...");
return new HelloService();
}
}
这样helloService2就注入进来了
@Test
public void beanTest2(){
boolean b = ioc.containsBean("helloService2");
System.out.println(b);
}
测试结果为true。
四、多个文件
在实际开发中,我们可能会有多个配置文件,比如本地的配置,测试的配置,正式的配置,这个时候我们就可以使用,一般我们会命名为:application-{profile}.properties/yml,那我们新建2个配置文件:

然后在application.yml加上
spring:
profiles:
active: dev
这样我们可以方便的切换环境配置,那上线的时候我们想改动配置文件怎么办呢?带参数命令就可以实现
java -jar springboot-learn-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;
我们可以用多个文件来进行配置,那么就会有优先级的问题,springboot是怎么做的呢?
springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件,并按照以下顺序进行扫描:
1、根目录下:./config/
2、根目录下:./
3、类路径下:/config/
4、类路径下classpath:/
优先级由高到底,如果后面的文件有相同配置则不起作用,这些配置文件都是互补配置,我们可以将需要的配置文件分类进行写入。
spingboot有很多自动配置类,并且为这些自动配置类提供了默认的properties,如数据库连接配置。

我们根据这个properties,再进行相应的属性配置:

五、总结
SpringBoot启动会加载大量的自动配置类,我们看我们需要的功能有没有SpringBoot默认写好的自动配置类,我们再来看这个自动配置类中到底配置了哪些组件,(只要我们要用的组件有,我们就不需要再来配置了)给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们就可以在配置文件中指定这些属性的值。
SpringBoot之旅第二篇-配置的更多相关文章
- [老老实实学WCF] 第二篇 配置WCF
老老实实学WCF 第二篇 配置WCF 在上一篇中,我们在一个控制台应用程序中编写了一个简单的WCF服务并承载了它.先回顾一下服务端的代码: using System; using System.Col ...
- 老老实实学习WCF[第二篇] 配置wcf
老老实实学WCF 第二篇 配置WCF 在上一篇中,我们在一个控制台应用程序中编写了一个简单的WCF服务并承载了它.先回顾一下服务端的代码: using System; using System.Col ...
- (转)[老老实实学WCF] 第二篇 配置WCF
第二篇 配置WCF 在上一篇中,我们在一个控制台应用程序中编写了一个简单的WCF服务并承载了它.先回顾一下服务端的代码: using System; using System.Collections. ...
- 第二篇 配置wcf
老老实实学WCF 第二篇 配置WCF 在上一篇中,我们在一个控制台应用程序中编写了一个简单的WCF服务并承载了它.先回顾一下服务端的代码: using System; using System.Col ...
- (转)[老老实实学WCF] 第二篇 配置WCF
在上一篇中,我们在一个控制台应用程序中编写了一个简单的WCF服务并承载了它.先回顾一下服务端的代码: using System; using System.Collections.Generic; u ...
- SpringBoot之旅第一篇-初探
一.SpringBoot是什么? 微服务,应该是近年来最火的概念,越来越多的公司开始使用微服务架构,面试中被问到的微服务的概率很高,不管对技术的追求,还是为了进更好的公司,微服务都是我们开发人员的必须 ...
- Mybatis之旅第二篇-Mapper动态代理方式
一.引言 通过上一篇mybatis的入门学习,我们已经会使用mybatis实现简单的增删改查,但是我们也发现了用原始Dao开发的一些问题: Dao方法体存在重复代码:通过SqlSessionFacto ...
- Spring之旅第二篇-Spring IOC概念及原理分析
一.IOC概念 上一篇已经了解了spring的相关概念,并且创建了一个Spring项目.spring中有最重要的两个概念:IOC和AOP,我们先从IOC入手. IOC全称Inversion of Co ...
- (转) SpringBoot非官方教程 | 第二篇:Spring Boot配置文件详解
springboot采纳了建立生产就绪spring应用程序的观点. Spring Boot优先于配置的惯例,旨在让您尽快启动和运行.在一般情况下,我们不需要做太多的配置就能够让spring boot正 ...
随机推荐
- LocalDB + IIS
Win7 + IIS7 1. 安装 (1)LocalDB SQL Express 2012 选中:ENU\x64\SqlLocalDB.MSI (2).net4.5 .net4.5 然后,再配置IIS ...
- 第二课:Hadoop集群环境配置
一.Yum配置 1.检查Yum是否安装 rpm -qa|grep yum 2.修改yum源,我使用的是163的镜像源(http://mirrors.163.com/),根据自己的系统选择源, #进入目 ...
- AVL Tree 操作
1.AVL树是带有平衡条件的二叉查找树, 一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二叉查找树. 2.AVL树的删除要比插入复杂.如果删除相对较少,那么用懒惰删除的方法是最好的策略. 3 ...
- hive 分组排序,topN
hive 分组排序,topN 语法格式:row_number() OVER (partition by COL1 order by COL2 desc ) rankpartition by:类似hiv ...
- ccos2d-x 学习
渲染驱动方式,事件驱动方式 this->addChild(pSprite, 0); 的第二个参数(int zOrder)表示要添加到this类对象中的顺序.是由里向外的方向.值越大表示越在外面. ...
- asp.net路径问题
-------------初级篇---------------------------------------- 在一般的href中路径的引用问题 ./index.aspx与index.aspx都 ...
- Mac下设置JAVA_HOME和MAVEN_HOME
1.找到java安装路径 /usr/libexec/java_home 2.设置JAVA_HOME $ vim ~/.bash_profile ~/.bash_profile:每个用户都可使用该文件输 ...
- Netty中如何序列化数据
JDK提供了ObjectOutputStream和ObjectInputStream,用于通过网络对POJO的基本数据类型和图进行序列化和反序列化.该API并不复杂,而且可以被应用于任何实现了java ...
- 使用libpcap过滤arp
上一篇博客简单讲述了libpcap的工作流程及简单使用,今天我们需要做的是继续使用libpcap抓取我们感兴趣的流量,并进行简单的解析: 测试环境是centos 7 下面贴一张arp帧结构图: 下面我 ...
- 0517JS综合练习、挂事件练习
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...