SpringBoot配置注入

SpringBoot配置注入

springboot有两种常用的配置文件,properties和yml,默认配置文件名称是固定的,为application。

application.properties   

      语法结构 :key=value  例如 server.port=80    

application.yml        

      语法结构 :key:空格 value   例如  server:      

                                        port:80

以上两种配置文件代替传统的xml配置文件 例如:

<server>
    <port>80</port>
</server>
配置文件的作用 :设置SpringBoot自动配置的默认值。

通过@Value注解手动写入

具体代码如下:

@Component  
public class Book {
    @Value("水浒传")  //设置默认值
    private String bookName;
    @Value("400")
    private int pageNum;
    //省略get,set
    @Override
    public String toString() {
        return "Book{" +
                "bookName='" + bookName + '\'' +
                ", pageNum=" + pageNum +
                '}';
    }
}
测试内容及结果如下:

@SpringBootTest
public class testDemo {
    @Autowired
    private Book book;
    @Test
    public void testStudent(){
        System.out.println(book);
    }
}

结果如下:Book{bookName='水浒传', pageNum=400}

这种类似于直接赋值的方式有很明显的缺陷,不易进行定位和修改。

通过properties配置文件注入

待注入的pojo类如下:

@Component  //作为组件注入到springboot中
@PropertySource(value = "classpath:syw.properties")  //指定要使用的配置文件,如果不指定则默认使用application.properties
public class Teacher {
    @Value("${teacher.teacherName}")
    private String teacherName;
    @Value("${teacher.age}")
    private int age;
    //省略get,set
    @Override
    public String toString() {
        return "Teacher{" +
                "teacherName='" + teacherName + '\'' +
                ", age=" + age +
                '}';
    }
}

下面是syw.properties配置文件中的内容:

# 只能通过该方式初始化值,相比yaml来说,操作对象,数组,集合等不太方便
teacher.teacherName=Dream Data 
teacher.age=22

测试类以及结果如下:

@SpringBootTest
public class testDemo {
    @Autowired
    private Teacher teacher;
    @Test
    public void testStudent(){  
        System.out.println(teacher);
    }
}

输出结果:Teacher{teacherName='Dream Data ', age=22}
注意:
applicaiton文件使用中文内容的时候会乱码,需要配置properties文件的编码格式,如下图所示:


通过yml配置文件注入

首先了解一下yml的语法格式:

注意:
1、空格不能省略
2、以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。
3、属性和值的大小写都是十分敏感的。
自变量:普通的值  [ 数字,布尔值,字符串  ]
自变量直接写在后面就可以 , 字符串默认不用加上双引号或者单引号;k: v

注意:
    “ ” 双引号,不会转义字符串里面的特殊字符 , 特殊字符会作为普通字符输出
    比如 :name: "dream \n data"   输出 :dream  \n   data

    '' 单引号,会转义特殊字符 , 特殊字符最终会变成本身所表达的意思
    比如 :name: 'dream \n data'   输出 :dream  换行   data
    
对象、Map(键值对)
#对象、Map格式
k: 
    v1:
    v2:
在下一行来写对象的属性和值得关系,注意缩进;比如:
student:
    name: syw
    age: 3

行内写法  student: {name: syw,age: 3}

数组( List、set )

用 - 值表示数组中的一个元素,比如:
pets:
 - cat
 - dog
 - pig
行内写法 pets: [cat,dog,pig]

1.下面是使用yml配置文件复杂对象:

/**
 * @ConfigurationProperties作用:
 * 将配置文件中配置的每一个属性的值,映射到这个组件中;
 * 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
 * 参数 prefix = “student” : 将配置文件中的student下面的所有属性一一对应
 */
@Component
@ConfigurationProperties(prefix = "student")
public class Student {
    private String studentName;
    private Integer age;
    private Boolean happy;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Teacher teacher;
    //省略get,set
    @Override
    public String toString() {
        return "Student{" +
                "studentName='" + studentName + '\'' +
                ", age=" + age +
                ", happy=" + happy +
                ", birth=" + birth +
                ", maps=" + maps +
                ", lists=" + lists +
                ", teacher="+ teacher+
                '}';
    }
}

2.通过yml文件注入简单对象

@Component
public class Dog {
    @Value("${dog.dogName}")  //通过该方式自动赋值为yaml文件中的初始值
    private String dogName;
    @Value("${dog.age}")
    private String age;
    @Override
    public String toString() {
        return "Dog{" +
                "dogName='" + dogName + '\'' +
                ", age='" + age + '\'' +
                '}';
    }
}

配置文件application.yml的内容如下:

student:
  studentName: syw
  age: 22
  happy: false
  birth: 2000/01/01
  maps: {k1: v1,k2: v2}
  lists:
    - code
    - movie
    - music
  teacher:
    teacherName: 鬼谷子
    age: 100


dog:
  dogName: 小明
  age: 10

测试类与结果如下

@SpringBootTest
public class testDemo {
    @Autowired
    private Student student;
    @Autowired
    private Dog dog;
    @Test
    public void testStudent(){
        System.out.println(student);
        System.out.println(dog);
    }
}

1.复杂对象的结果如下:

Student{studentName='syw', age=22, happy=false, birth=Sat Jan 01 00:00:00 CST 2000, maps={k1=v1, k2=v2}, lists=[code, movie, music], teacher=Teacher{teacherName='鬼谷子', age=100}}

2.简单对象的结果如下:
Dog{dogName='小明', age='10'}

Pom文件引入插件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.11.Release</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>cn.henu</groupId>
    <artifactId>config</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringBoot-Config</name>
    <description>config</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        ...
        <!--添加配置文件提示,让自己手动添加的Component组建在初始化的时候也有提示-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!--打包的时候不用打包这个插件-->
                    <excludes>
                        <exclude>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-configuration-processor</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

引入插件,此时会有提示,方便书写

-END-

全部评论