SpringBoot_Chapter1 | Eloise's Paradise
0%

SpringBoot_Chapter1

此章节介绍一些springboot基础配置操作, 主要包括:

个性化banner配置, 容器相关配置, 属性注入, 类型安全的属性注入,ymal方式配置 以及profile切换.

SpringBoot基础配置

Web容器配置

新建springboot项目后可能最常见的就是要配置一下web容器, 常见的tomcat配置, 观察pom依赖引入的jar包中已经有tomcat了, 所以直接在application.properties中配置相关属性即可:

1
2
3
4
server.port=8081 # 如果想使用随机端口, 此处设置为0 即可。 
server.servlet.context-path=/lee

server.tomcat.accesslog.prefix=access_log

配置完新建一个测试类并启动项目,启动日志如下:

1
2
3
4
5
6
7
8
9
10
2020-09-22 09:03:43.091  INFO 34489 --- [           main] com.lee.chapter1.Chapter1Application     : Starting Chapter1Application on Hoffman.local with PID 34489 (/Volumes/X/MyCode/chapter1/target/classes started by William.Hoffman.Leon in /Volumes/X/MyCode/chapter1)
2020-09-22 09:03:43.134 INFO 34489 --- [ main] com.lee.chapter1.Chapter1Application : No active profile set, falling back to default profiles: default
2020-09-22 09:03:44.866 INFO 34489 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8081 (http)
2020-09-22 09:03:44.878 INFO 34489 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2020-09-22 09:03:44.879 INFO 34489 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.38]
2020-09-22 09:03:44.980 INFO 34489 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/lee] : Initializing Spring embedded WebApplicationContext
2020-09-22 09:03:44.980 INFO 34489 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1750 ms
2020-09-22 09:03:45.245 INFO 34489 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2020-09-22 09:03:45.528 INFO 34489 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8081 (http) with context path '/lee'
2020-09-22 09:03:45.544 INFO 34489 --- [ main] com.lee.chapter1.Chapter1Application : Started Chapter1Application in 3.284 seconds (JVM running for 4.718)

测试类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.lee.chapter1.Controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HiController {

@GetMapping("/hi")
public String hi(){
return "Hi";
}
}

然后前端访问测试访问:

前端测试

前端访问的同时后台输出:

1
2
3
2020-09-22 09:04:05.638  INFO 34489 --- [nio-8081-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/lee]    : Initializing Spring DispatcherServlet 'dispatcherServlet'
2020-09-22 09:04:05.639 INFO 34489 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2020-09-22 09:04:05.649 INFO 34489 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 9 ms
1
**注意: 上面的配置中, 只有前两行是容器类别无关的,第三行设置的tomcat访问日之前缀才是类别相关的,  因为常见的web容器除了tomcat, 还有jetty,underdow等.如果不想使用springboot内置的tomcat作为容器, 需要再pom文件中先配除掉然后引入新的容器依赖. **

server配置

https配置

属性注入

项目中可能会有这样的需求, 在application.properties中定义了变量值后, 想要绑定到对应的对象属性, 也就是属性注入.

例如在application.properties中:

1
2
3
book.id=1
book.name=三国演义
book.price=99

注入到Book类, 需要用 @Value注解,按如下格式注入:

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package com.lee.chapter1.pojo;

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

@Component
public class Book {
@Override
public String toString() {
return "Book{" +
"id=" + id +
", name='" + name + '\'' +
", price=" + price +
'}';
}

public Integer getId() {
return id;
}

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

public String getName() {
return name;
}

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

public Double getPrice() {
return price;
}

public void setPrice(Double price) {
this.price = price;
}
@Value("${book.id}")
private Integer id;
@Value("${book.name}")
private String name;
@Value("${book.price}")
private Double price;
}

在测试类中注入Book.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.lee.chapter1;

import com.lee.chapter1.pojo.Book;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class Chapter1ApplicationTests {

@Autowired
Book book;
@Test
public void contextLoads() {
System.out.println(book.toString());
}

}

然后启动测试类可以看到打印出book属性值, 但是乱码, 需要设置file encodin后重新保存即可.

设置编码

重新启动可以看到测试结果如下:

测试结果

安全的属性注入

但是如果有很多变量都像这样需要注入到某对象的属性中, 如果都使用@Value挨个设置就会很臃肿, 也不便于维护. 一种更简单的注入方式就是使用@ConfigurationProperties注解注入:

1
2


1
2
3
4
5
6
7
8
9
10
@ConfigurationProperties(prefix = "book.mine")
public class Book {
//@Value("${book.id}")
private Integer id;
//@Value("${book.name}")
private String name;
//@Value("${book.price}")
private Double price;
...
}

可以看到application.properties文件中的变量:

1
2
3
book.mine.id=2
book.mine.name=西游记
book.mine.price=100

都成功注入到了属性中, 如下:

安全属性注入

Notes

还有一种配置方式: 将变量单独放到一个独立的book.properties文件中, 为了让项目启动时扫描时, 能将该文件中的信息扫描处理, 需要搭配注解使用, 方式如下:

首先配置book.properties

1
2
3
books.id=3
books.name=红楼梦
books.price=88

然后在bean Book上使用@PropertySource注解, 注意该注解要和@ConfigurationProperties注解一起使用, 否则不会注入.

1
2
3
4
5
6
7
8
9
10
11
@ConfigurationProperties(prefix = "books")
@PropertySource(value = "classpath:book.properties")
public class Book {
//@Value("${book.id}")
private Integer id;
//@Value("${book.name}")
private String name;
//@Value("${book.price}")
private Double price;
...
}

@ConfigurationProperties(prefix = “books”)

如果application.propertiesbook.properties都有books前缀开头的属性, 那么application.properties优先级高, 最终是application.properties里的值注入生效.

多Profile切换

新建三个配置文件:

application.properties 存放公共配置

1
server.servlet.context-path=/lee

application-dev.properties 存放开发环境的个性化配置

1
server.port=8081

application-prod.properties存放生产环境的个性化配置

1
server.port=8082

启动项目,看到终端输出的日志中有如下两行信息:

1
2
3
4
**
No active profile set, falling back to default profiles: default
Tomcat started on port(s): 8080 (http) with context path '/lee'
**

说明默认的application.properties文件中的配置属性在生效.

为了动态切换配置,在application.properties 中添加下面一行配置:

1
spring.profiles.active=dev

然后重新启动项目可以看到终端输出的日志中有如下两行信息:

1
2
3
4
**
spring.profiles.active=dev
Tomcat started on port(s): 8081 (http) with context path '/lee'
**

说明application-dev.properties 正在生效.

-------------本文结束感谢您的阅读-------------