SpringBoot之旅第二篇-配置

1、引言

虽然springboot帮咱们进行了自动配置,但配置仍是不可避免的,好比最简单的端口号,数据库链接。但springboot的配置通常不用xml进行配置,而是yml和properties,选择他们固然是由于他们更方便。java

YAML(YAML Ain't Markup Language)是以数据为中心的,因此比xml和json更适合作配置文件,咱们看一个简单例子:配端口号spring

yaml的写法是:数据库

server:
  port: 8089

xml的写法是:json

<server>
    <port>8081</port>
</server>

直观上咱们就能看到yaml的写法更简练,xml用了很大的空间放在标签的开闭上,而yaml不须要,下面咱们来细讲yaml的语法。数组

 

2、YAML语法

yaml的基本语法是 k:(空格)v:表示一对键值对(空格必须有),以空格的缩进来控制层级关系,只要是左对齐的一列数据,都是同一个层级的。且属性和值都是大小写敏感的。如:springboot

server:
  port: 8081
  path: /hello

咱们重点看看值的写法,值的写法是指能够用哪些写法来写值,通常有:字面量,对象、Map,数组app

字面量:就是指普通的值(数字,字符串,布尔),这个写法就是直接k: v:方式,字符串默认不用加上单引号或者双引号,若是加了,那双引号和单引号是有区别的,区别在因而不是转义特殊字符,双引号会转义特殊字符,而单引号不会。如:测试

name: "yuanqinnan \n yuanyuan" 输出;yuanqinnan 换行  yuanyuan
name: ‘yuanqinnan \n yuanyuan’:输出;yuanqinnan \n  yuanyuan

对象、Map的写法也是普通的k: v 写法,在下一行来写对象的属性和值的关系。如spa

friends:
  lastName: zhangsan
  age: 20

也能够一行完成.net

friends: {lastName: zhangsan,age: 18}

数组(List、Set)

用- 值表示数组中的一个元素,如:

pets:
 - cat
 - dog
 - pig

记得- 后要打空格,这也有一行写法:

pets: [cat,dog,pig]

 

3、配置文件注入

配置文件写完,那么咱们就要来使用了,下面讲配置文件值注入。

第一种方式@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。

 

4、多个文件

在实际开发中,咱们可能会有多个配置文件,好比本地的配置,测试的配置,正式的配置,这个时候咱们就可使用,通常咱们会命名为: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的默认配置文件,并按照如下顺序进行扫描:

一、根目录下:./config/

二、根目录下:./

三、类路径下:/config/

四、类路径下classpath:/

优先级由高到底,若是后面的文件有相同配置则不起做用,这些配置文件都是互补配置,咱们能够将须要的配置文件分类进行写入。

spingboot有不少自动配置类,而且为这些自动配置类提供了默认的properties,如数据库链接配置。

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

 

5、总结

SpringBoot启动会加载大量的自动配置类,咱们看咱们须要的功能有没有SpringBoot默认写好的自动配置类,咱们再来看这个自动配置类中到底配置了哪些组件,(只要咱们要用的组件有,咱们就不须要再来配置了)给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。咱们就能够在配置文件中指定这些属性的值。

相关文章
相关标签/搜索