Springboot配置(上)

一、配置文件

—Springboot使用一个全局的配置文件,配置文件名是固定的,有如下两种方式:

    - application.propertis

    - application.yal

—配置文件放在src/java/resources目录下

— .yml是YAML(YAML Ain't Markup Language)语言的文件,

    - YAML A Markup Language:是一个标记语言

    - YAML isn't Markup Language:不是一个标记语言

    标记语言:

    - 以前的配置文件,大多数是使用xxxx.xml文件

    - YAML:以数据为中心,比json、xml更适合做配置文件

—作用:全局配置文件可以对一些默认的配置值进行修改。Springboot在底层都给我们自动配置好了。

    - application.propertis

server.port=8090

    - application.yal

server:
  port: 8090
二、YAML语法

1、YAML基本语法

k:(空格)v   -- 表示一对键值对(空格必须有)

—使用缩进表示层级关系

—缩进时不允许使用tab键,只允许使用空格键

—缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

server:
  port: 8090
  path: /hello

—大小写敏感

2、YAML支持的三种数据结构

—对象、Map:键值对的集合

    k: v--在下一行来写对象属性和值的关系;注意缩进

        对象还是k: v的方式

        如:

friends:
        lastName: zh
        age: 20

        行内写法:

friends:{lastName: zh,age: 20}
                       

—数组(List、Set):一组按次序排列的值、

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

pets:
   - dog
   - cat

行内写法:

pets:[dog,cat]

—字面量:单个的,不可再分的值(数字、字符串、布尔)

    k: v--字面直接写

             字符串默认不用加上单引号或者双引号

           “”:不会转义字符串里面的特殊字符;特殊字符会作为本身想表达的意思

                     name: "zh \n li";输出:zh 换行 li

          ‘’:会转义特殊字符,特殊字符最终只是一个普通的字符串数据。

                     name: 'zh \n li';输出:zh \n li

三、YAML值获取

.yml文件中的配置:

person:
  name: zh
  age: 20
  birth: 2018/02/09
  maps: {k1:v1,k2:v2}
  lists:
    - lisi
    - zhaoliu
  dog:
   name: 小狗
   age: 2

将yml中的值与实体类中的属性进行映射绑定

/**
 * 将配置文件中的每一个属性的值,映射到这个组件中
 * @ConfigurationProperties:告诉Springboot将本类中的所有属性和配置文件中的相关配置进行绑定
 *      prefix = "person":配置文件中哪个下面的所有属性进行一一映射
 * 只有这个组件是容器中的组件才能使用容器提供的@ConfigurationProperties功能
 */
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private Integer age;
    private Date birth;

    private Map<String,Object> maps;
    private List<Object> lists;

    private Dog dog;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public Map<String, Object> getMaps() {
        return maps;
    }

    public void setMaps(Map<String, Object> maps) {
        this.maps = maps;
    }

    public List<Object> getLists() {
        return lists;
    }

    public void setLists(List<Object> lists) {
        this.lists = lists;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", birth=" + birth +
                ", maps=" + maps +
                ", lists=" + lists +
                ", dog=" + dog +
                '}';
    }
}

需要配置一个配置文件处理器的依赖:

<!--导入配置文件处理器,配置文件进行绑定就会提示-->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-configuration-processor</artifactId>
   <optional>true</optional>
</dependency>

四、property获取值

使用property文件获取值除了配置文件变化,其他都不需要变化

# 配置person的值
person.name=李四
person.age=21
person.birth=2018/09/09
person.maps.k1=11
person.maps.k2=12
person.lists=a,b,c
person.dog.name=小狗
person.dog.age=3

但是使用property配置文件会出现乱码的问题:


默认IDEA的property使用的是utf-8

在设置中改变编码方式:




五、另一种从配置文件中获取值的方式

@Component
//@ConfigurationProperties(prefix = "person")
public class Person {

    /**
     * @Value相当于
     * <bean>
     *     <property name="name" value="字面量/${key}从环境变量和配置文件中获取值/#{SPEL}"></property>
     * </bean>
     */
    @Value("${person.name}")
    private String name;
    @Value("#{11*2}")
    private Integer age;
    private Date birth;

    private Map<String,Object> maps;
    private List<Object> lists;

    private Dog dog;

1、其中@Value和@ConfigurationProperties获取值的比较



@ConfigurationProperties
@Value
功能
批量注入配置文件中的属性一个一个设置
松散绑定(松散语法)
支持不支持
SPEL表达式支持不支持

JSR303数据校验

支持不支持

关于复杂数据类型,@ConfigurationProperties是支持的,@Value是不支持的


yml和property都能获取到值。

关于使用场景:

如果我们只是在某个业务逻辑中需要获取一下配置文件的某项属性值,我们就使用@Value。

@ResponseBody
@Controller
public class HelloController {

    @Value("${person.name}")
    private String name;

    @RequestMapping("/sayHello")
    public String sayHello(){
        return "hello "+name;
    }
}
如果我们专门编写了一个JavaBean来和配置文件进行映射,我们就使用@ConfigurationProperties

2、数据校验

@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {

    /**
     * @Value相当于
     * <bean>
     *     <property name="name" value="字面量/${key}从环境变量和配置文件中获取值/#{SPEL}"></property>
     * </bean>
     */
    @Email//名字必须是邮箱格式
    //@Value("${person.name}")
    private String name;
    //@Value("#{11*2}")
    private Integer age;
    private Date birth;

    private Map<String,Object> maps;
    private List<Object> lists;

    private Dog dog;
六、@PropertySource&@ImportResource

@PropertySource:加载指定的配置文件

@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
//@Validated
public class Person {

    /**
     * @Value相当于
     * <bean>
     *     <property name="name" value="字面量/${key}从环境变量和配置文件中获取值/#{SPEL}"></property>
     * </bean>
     */
    //@Email//名字必须是邮箱格式
    //@Value("${person.name}")
    private String name;
    //@Value("#{11*2}")
    private Integer age;
    private Date birth;

    private Map<String,Object> maps;
    private List<Object> lists;

    private Dog dog;
@ImportResource:导入Spring的配置文件,让配置文件中的内容生效。

Springboot中没有Spring的配置文件,我们自己编写的配置文件也不能自动识别,想让Spring的配置文件生效,加载进来,需要将@ImportResource标注在一个配置类上。

@ImportResource(locations = "classpath:beans.xml")--导入Spring的配置文件让其生效

不来编写Spring的配置文件:

<?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="service" class="com.smart.springboot.service.HelloService"/>
</beans>
Springboot推荐给容器中添加组件的方式:推荐使用全注解的方式

1、配置类-----Spring配置文件

2、使用@Bean给容器中添加组件

/**
 * @Configuration指明当前类是一个配置类,就是来替代之前的Spring配置文件
 * 在配置文件中使用<bean></bean>标签添加组件
 */
@Configuration
public class MyAppConfig {

    //作用就是将方法的返回值添加到容器中,容器中这个组件默认的id就是方法名
    @Bean
    public HelloService helloService(){
        System.out.println("配置类@Bean给容器中添加组件了");
        return new HelloService();
    }
}

七、配置文件的占位符

1、配置文件中可以使用Springboot提供的随机数

${random.value}、${random.int}------

2、占位符获取之前配置的值,如果没有可以使用“:”(冒号)指定默认值

# 设置person的值ֵ
person.name=张三${random.uuid}
person.age=${random.int}
person.birth=2018/09/09
person.maps.k1=11
person.maps.k2=12
person.lists=a,b,c
person.dog.name=${person.name}_小狗
person.dog.age=3
八、Profile

Profile是Spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境。

1、多Profile文件形式:

— 格式:application-{profile}.properties:

    - application-dev.properties/.yml

    - application-prod.properties/.yml

默认使用主配置:application.properties的配置

2、多Profile文档块模式 :

    —yml中可以使用文档块的方式(就是三个横线)

server:
  port: 8090
spring:
  profiles:
    active: dev
---
server:
  port: 8091
spring:
  profiles: dev
---
server:
  port: 8092
spring:
  profiles: prod  #指定属于哪个环境


3、激活方式:

    — 命令行 -- spring.profile.active=dev

    — 配置文件   spring.profile.active=dev

    — JVM参数   -Dspring.profile.active=dev    

posted @ 2018-06-26 15:05  惶者  阅读(276)  评论(0编辑  收藏  举报