此章节介绍一些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 3 4 5 6 7 8 9 10
| @ConfigurationProperties(prefix = "book.mine") public class Book { private Integer id; private String name; 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 { private Integer id; private String name; private Double price; ... }
|
@ConfigurationProperties(prefix = “books”)
如果application.properties和book.properties都有books前缀开头的属性, 那么application.properties优先级高, 最终是application.properties里的值注入生效.
多Profile切换
新建三个配置文件:
application.properties 存放公共配置
1
| server.servlet.context-path=/lee
|
application-dev.properties 存放开发环境的个性化配置
application-prod.properties存放生产环境的个性化配置
启动项目,看到终端输出的日志中有如下两行信息:
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 正在生效.