第二章springboot核心配置与注解

时间:2024-11-13 22:41:49

本章学习的目标

2.1 全局配置文件

全局配置文件能对默认配置值进行修改,下面介绍两种全局配置文件:

2.1.1 application.properties配置文件

springboot项目启动时会自动启动这个配置文件,我们可以在这个文件中配置相关属性,

下面通过案例对这个配置文件的使用进行讲解:

1.新建一个springboot项目

2.为啦查看它的效果,现在新建两个类:

package com.waiguoyu.twoday.domain;

public class Pet {
    private String type;
    private String name;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Pet{" +
                "type='" + type + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

package com.waiguoyu.twoday.domain;


import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;
import java.util.Map;


@Component //用于将该类作为bean注入spring容器中,然后@ConfigurationProperties(prefix = "person")才能给他赋值
@ConfigurationProperties(prefix = "person") //将配置文件中以person开头的属性通过setter方法注入该类中对应的属性里
public class Person {
    private int id;
    private String name;
    private List hobby;
    private String[] family;
    private Map map;
    private Pet pet;

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", hobby=" + hobby +
                ", family=" + Arrays.toString(family) +
                ", map=" + map +
                ", pet=" + pet +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public List getHobby() {
        return hobby;
    }

    public void setHobby(List hobby) {
        this.hobby = hobby;
    }

    public String[] getFamily() {
        return family;
    }

    public void setFamily(String[] family) {
        this.family = family;
    }

    public Map getMap() {
        return map;
    }

    public void setMap(Map map) {
        this.map = map;
    }

    public Pet getPet() {
        return pet;
    }

    public void setPet(Pet pet) {
        this.pet = pet;
    }
}

接下来演示在配置文件中注入person实体类的对应属性,

3.打开全局配置文件,输入:

#对实体类对象person进行属性配置,通过类名.xx的方式对对应属性进行赋值,然后通过注解注入实体类中
person.id=1
person.name=tom
person.hobby=pley,read
person.family=father
person.map.k2=v1
person.map.k1=v2
person.pet.type=dog
person.pet.name=kity

提示:配置文件输入代码的时候不会有提示代码,你需要添加一个配置处理器依赖,就方便代码书写啦。

4.进行单元测试进行输出测试:

这里就可以学习到如何进行全局配置文件的属性注入啦,并且能够查看到注入的实体类对应的属性也有属性值啦。

2.1.2 application.yaml配置文件

yaml格式是springboot支持的一种json超集文件格式,它以数据为核心,更容易被计算机识别。

yaml的工作原理跟properties配置文件的工作原理相同,yaml比后者更简洁。

语法格式:

下面介绍他不同数据类型的属性值设置:

下面讲解使用案例为person实体类赋值:

1.在resouce目录下新建对应的配置文件。

2.在yaml书写内容,注解propertis文件中的注入值(因为properties配置文件优先级大于yaml)

#这些配置属性跟properties配置文件的注入方式是一样的,
person:
  id: 2
  name: zhangshan
  hobby: [spring,read]
  family: [made,mode]
  map: {k1:v23,k2:12344}
  pet: {type:cat,name:tom}

3.进行单元测试。

在这里学会如何使用配置文件对实体类进行配置属性,以及配置文件的语法格式。

推荐使用yaml的配置文件。

2.2 配置文件属性值的注入

全局配置文件配置的属性是:1.框架默认提供的属性,如:server.port(服务器端口号),那么框架会自动扫描并读取属性值,2.配置的属性是自定义的属性,如上边的那些,则需要注入的方式才能生效。

这里讲解如何使用注解注入属性。

2.2.1 使用@ConfigurationProperties注入属性

这个注解可以批量的把配置文件中的属性值配置到某个bean类的对应属性中。

上边案例有使用方式,需要注意:使用这个注解时配置文件中的属性名要和实体类中的属性名相同才可以注入。

2.2.2使用@Value注入属性

这个是springboot继承spring框架的注解,使用格式:

下面通过实例对该注解的使用进行熟悉:

1.新建实体类并使用注解注入属性:

package com.waiguoyu.twoday.domain;


import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

@Component//把该类作为bean添加到容器中
public class Student {
    @Value("${person.id}")
    private int id;
    @Value("${person.name}")
    private String name;
    private List hobby;
    private String[] family;
    private Map map;
    private Pet pet;

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", hobby=" + hobby +
                ", family=" + Arrays.toString(family) +
                ", map=" + map +
                ", pet=" + pet +
                '}';
    }




}

2.编写测试类进行测试:

@Autowired
    private Student student;
    @Test
    public void studenttest(){
        System.out.println(student);
    }

运行之后看结果就知道注入成功啦,注意:

1.这个注解只能注入基本数据类型。

2.提问 它可以在注入的时候直接给id属性赋值:这里我就有疑惑啦,该怎么注入,并且是可以给int类型赋值还可以给其他基本类型直接赋值吗?

        

2.2.3 两种注解对比分析

详细讲解:

1.第一个注解只有springboot有,第二个注解两个都有。

2.第一个注解批量给bean对象注入值,而第二个注解只能给的单个bean对象注入值

3.第一个注解需要对应的bean类有setter方法,并且配置文件没有对应设置某个属性的值,该属性自动为null,第二个注解不需要setter方法,直接在配置文件读取属性值然后注入,如果配置文件没有设置对应的属性值则会报错。

4.第一个注解可以注入多种类型,而第二个注解只能注入基本数据类型

5.第一个注解注入时支持松散绑定语法,也就是配置文件可以写成:

6.JSR303数据效验:配置文件里面属性值注入时,要看注入的值是否符合相关值得规则,比如int类型传string类型得就不行。

检查注入email值是否合规。

7.第二个注解支持SpEL表达式,可以直接给属性注入值:
 

在实际开发中:1.要引入个别属性值,推荐使用@value,2.需要批量注入得时候使用ConfigurationProperties注解。

2.3 Springboot自定义配置

我们在开发过程中几乎所有配置都在全局配置文件中写,但是我们也需要学会自定义配置文件

接下来讲解自定义配置文件及其加载方式进行详细讲解:
 

2.3.1 使用@propertySource加载配置文件

加载自定义配置文件可以使用的注解:1.@propertySource,2.@Configuration。

@propertySource可以指定自定义配置文件的位置和名称。@Configuration把实体类指定为自定义配置类,自定义配置文件的注入:可以使用上边学到的注入的注解。

通过案例来讲解如何使用@propertySource加载自定义配置文件:

1.新建自定义配置文件:

2.新建配置类:
 

package com.waiguoyu.twoday.domain;


import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration//指定为自定义配置类,等同于@Component注解
@PropertySource("classpath:test.properties")//指定自定义配置类的位置和名字,在calsspath路径下的配置文件
@EnableConfigurationProperties(MyProperties.class)//开启该配置类的属性注入功能,配合ConfigurationProperties使用
@ConfigurationProperties(prefix = "test")//指定配置文件注入属性的前缀,将test开头的属性注入对应属性
public class MyProperties {
    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "MyProperties{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

3.书写单元测试类,进行测试。

测试成功。

通过这个案例就可以学会如何给自定义配置类注入配置文件的属性。

2.3.2 使用@ImprtResource加载XML配置文件

对应的使用案例:

1.在admin下新建类:Myserver。不用书写代码(这时候无法被springboot识别)

2.新建xml文件,如下:

这个时候已经把Myserver类以bean的方式添加到spring的bean容器中啦

3.在启动类上添加@ImprtResource注解指定xml位置“

@ImportResource("classpath:beans.xml")//加载对应的xml文件
@SpringBootApplication
public class TwodayApplication {

    public static void main(String[] args) {
        SpringApplication.run(TwodayApplication.class, args);
    }

}

4.想引用这个bean需要使用

使用ApplicationContest来获取对应的bean。

2.3.3 使用@Configuration编写自定义配置类

上边引入xml的方法不常用,为啦保存约定大于配置的思想,推荐使用配置类的方式代替xml配置。

@Configuration注解指定配置类,配合@bean把bean注入Spring容器。

具体怎么使用看案例:
1.新建myconfig,并使用@Configuration声明该类为配置类:
就相当于使用注解编写xml配置文件,在这个文件里面添加想要添加到bean的类。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration//标记该类为配置类,类似声明xml文件
public class MyConfig {


    @Bean//返回值对象会被声明加入到spring容器中,默认id名为方法名
    public Myserver myserver(){
        return new Myserver();
    }


}


}

2.在启动类加载xml文件

3.编写单元测试类进行测试。

bug:在这里我使用这边的代码使用错误,有问题,为啦进度,先跳过!

2.4 profile多环境配置

实际开发中,项目要运行在不同的开发环境,为啦方便切换环境,springboot给拉两种多环境配置的方式。

2.4.1使用profile文件进行多环境配置

前置条件:配置文件名规定:以application-{对应的环境名}.properties格式,如:

想要使用上述的配置环境文件,可以使用两种方式:1.控制台切换,2.在springboot全局配置文件那切换。

下面通过案例来进行使用分析:

1.新建对应的配置文件并对应设置端口:

2.在全局配置文件激活对应的环境:


#激活要激活指定的properties文件
spring.profiles.active=dev

3.启动启动类即可在控制台看到对应的端口啦。

2.4.2 使用@Profile注解进行多环境配置

       Profile注解主要作用在类上,通过value属性指定配置环境。他也需要在全局配置环境中声明。

通过案例来学习一下如何使用它:

1.在config包下创建用于配置数据库的接口文件:

2.在config包下创建三个实现接口的实现类,并从写对应的方法。

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Configuration//声明类为配置类。让springboot自动扫描它
@Profile("dev")//用于进行多环节配置,通过属性值标识配置环境
public class DevDBConnector implements DBConnector {

    @Override
    public void configure() {
        System.out.println("数据库环境配置dev");
    }
}

其他的测试环境类似。

3.在全局配置文件激活对应的环境:


#激活要激活指定的@profile构建的配置环境
spring.profiles.active=dev

4.测试效果,我们需要新建 controller包,在该包下新建一个表示数据库连接配置的DBController类进行测试;

在这类遇见比较奇怪的bug:书上说可以它们两种方式都可以配置环境,可是,我设置的时候,却不能,第一中方式配置啦dev,但是第二种方式怎么配置dev环境?


 

2.5 随机值设置以及参数间引用

springboot设置属性值时可以用上边的方式设置,也可以 用 随机值 和 参数间的引用两种方式来设置属性值。

2.5.1随机值设置属性值

springboot的配置文件中,随机值的设置用到,对一些测试用例属性值还有隐秘属性值进行随机数注入。

随机值设计的语法:,这里的xx设置随机值的类型和范围,它可以生成:1.随机整数,2.通用唯一识别码(UUID),3.字符串。

设置方式:

2.5.2参数间引用

配置文件中的属性值可以参数之间的引用,使用这个方式的好处是:有多个关联的配置属性,只需要对其中一个地方进行属性配置,其他地方都可以修改。

参数间引用的格式:,xx表示在配置文件中已经配置过的属性名。

通过案例来学习它们如何使用:

1.在全局配置文件中通过两种方式添加测试属性:

#随机值设置,设置随机值在10到20 之间
tom.age= ${random.int[10,20]}
#参数间引用设置,引用随机值设置的属性值给属性配置值
tom.description=Tom的年龄可能是${tom.age}

2.在测试类中定义方法:

@Value("${tom.description}")//给定义的description属性注入值
private String description;
@Test
public void placeholdertiontest(){
    System.out.println(description);
}

这里就是教你如何在配置文件中设置属性的随机值,以及去引用其他配置属性的属性值。

注入方式跟上面的一样。

在这里我输出出配置属性值,文字出现乱码

这里的习题就自行练习啦。

为啦完成学习目标需要指定学习任务去完成任务去完成对应的目标:
前边需要熟悉和掌握的都需要背下对应的案例以及注解的使用。