Spring Boot学习笔记 02

0x01 多环境下核心配置文件的使用(properties)

需要注意.properties中的属性值不要出现空格,会被识别出现问题!

在工作中的开发环境有

  • 开发环境(dev)
  • 测试环境(test)
  • 准生产环境(pre)
  • 生产环境(product)

老样子,我们在创建号的SpringBoot环境下,在Application.java文件的同级目录或下级目录创建一个Controller/IndexController.java,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.springboot.springboot006multienvironment.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class IndexController {
@RequestMapping(value = "/say")
@ResponseBody
public String say() {
return "Hello Multi-Environment!";
}
}

下面我们分别对应上面四个开发环境创建对应的核心配置文件:

1
2
3
4
5
touch application.properties
touch application-dev.properties
touch application-test.properties
touch application-pre.properties
touch application-product.properties

每个环境的核心配置文件名的格式都是 application-XXXX.properties 其中的XXXX由自己命名,并在 主核心配置文件 中调用:

application.properties:

1
2
3
#Springboot主核心配置文件
#激活使用的配置文件,XXXX对应文件名中的XXXX
spring.profiles.active=XXXX

其他核心配置文件则与原来单核心配置文件相同:

application-dev.properties:

1
2
server.port=8080
server.servlet.context-path=/dev

application-test.properties:

1
2
server.port=8081
server.servlet.context-path=/test

application-pre.properties:

1
2
server.port=8082
server.servlet.context-path=/pre

application-product.properties:

1
2
server.port=8083
server.servlet.context-path=/product

这样我们就完成了在不同环境下的核心配置文件配置,浏览器URL框输入时区分默认路径即可。

比如输入http://localhost:8081/test/say 就会显示出我们在IndexController中创建的函数say返回的内容”Hello Multi-Environment!”。

0x02 多环境下的核心配置文件的使用(yml)

yml(或者yaml)与properties文件的配置方法大同小异,只有文件内容格式上的差异,其他基本一样。

所以这里只给出配置后的核心文件的内容:

application.yml:

1
2
3
spring:
profiles:
active: dev

application-dev.yml:

1
2
3
4
server:
port: 8080
servlet:
context-path: /dev

application-test.yml:

1
2
3
4
server:
port: 8081
servlet:
context-path: /test

application-product.yml:

1
2
3
4
server:
port: 8082
servlet:
context-path: /product

application-pre.yml:

1
2
3
4
server:
port: 8083
servlet:
context-path: /pre

0x03 获取application.properties(.yml)自定义配置

上面我们用的配置诸如server.port= server.servlet.context-path= 等等都是SpringBoot项目自带的配置项,如何自己创建一个自定义配置并获取它呢?

这里我们使用到__@Value__

在Application.java文件的同级目录或下级目录创建一个Controller/IndexController.java,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.spring.springboot008customerconfiguration.Controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class IndexController {
@Value("${school.name}")//创建school.name配置项,存放到String类型的变量中
private String schoolName;

@Value("${website}")//创建website配置项,存放到String类型的变量中
private String website;

@RequestMapping(value = "/say")
@ResponseBody
public String say() {
//输出获得的自定义配置
return "hello :" + schoolName + " Website : http://" + website;
}
}

配置文件application.properties中:

1
2
3
4
5
6
7
#设置内嵌tomcat 端口号
server.port=8080
#设置上下文根
server.servlet.context-path=/
#自定义
school.name=ECJTU
website=www.ecjtu.jx.cn

运行项目后我们打开浏览器输入http://localhost:8080/say,浏览器显示

1
hello :ECJTU Website : http://www.ecjtu.jx.cn

说明我们获取成功。

0x04 成组获取自定义配置对象

上一个部分0x03中,我们获取自定义配置是一个一个获取的,我们如何一组一组的获取呢,比如我们现在创建的application.properties文件如下:

1
2
3
4
5
6
7
8
9
10
#设置内嵌tomcat 端口号
server.port=8080
#设置上下文根
server.servlet.context-path=/

school.name=ECJTU
school.website=www.ecjtu.jx.cn

department.name=ECJTU1
department.website=www.ecjtu1.jx.cn

如何把school和department的name和website属性分别存到他们对应的构造体里面呢。

我们在application.java同级目录或下级目录中分别创建school.java和department.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.spring.springboot008customerconfiguration.Controller;

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

@Component//将此类交给Spring容器进行管理
@ConfigurationProperties(prefix = "school")//核心配置文件里面的前缀
public class School {
private String name;
private String website;

public String getName() {
return name;
}

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

public String getWebsite() {
return website;
}

public void setWebsite(String website) {
this.website = website;
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.spring.springboot008customerconfiguration.Controller;

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

@Component
@ConfigurationProperties(prefix = "department")//核心配置文件里面的前缀
public class Department {
private String name;
private String website;

public String getName() {
return name;
}

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

public String getWebsite() {
return website;
}

public void setWebsite(String website) {
this.website = website;
}
}

然后再创建一个IndexController.java 来输出结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.spring.springboot008customerconfiguration.Controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class IndexController {
@Autowired
private School school;

@Autowired
private Department department;

@RequestMapping(value = "/say")
@ResponseBody
public String say() {
String hello1 = "hello :" + department.getName() + " Website : http://" + department.getWebsite();
String hello2 = "hello :" + school.getName() + " Website : http://" + school.getWebsite();
return hello2 + "<br>" + hello1;
}
}

这样我们在浏览器输入http://localhost:8080/say 就可以得到如下结果:

1
2
hello :ECJTU Website : http://www.ecjtu.jx.cn
hello :ECJTU1 Website : http://www.ecjtu1.jx.cn

此方法只能获取核心配置文件中有前缀的属性,若没有前缀的单独属性必须要用0x03的方法!!

0x0401 使用@ConfigurationProperties注解出现警告处理:

当我们配置好School.java和Department.java这两个文件的时候IDEA上方会出现红色警告:

未配置Spring Boot注解处理器

但是这个并不影响我们代码的执行,如果要消除该警告,只需要在pom.xml配置文件中添加一个依赖:

1
2
3
4
5
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

这样就没有上述的警告了。