7. 配置 Spring Boot
写在开头,默认规则:启动端口 8080
;Web上下文访问目录 /
配置信息均可以在 application.properties
文件中配置
- 基础配置
- Web监听端口配置
- application.properties:
server.port=9090
- 命令行指定启动端口:
java -jar bootsample.jar --server.port=9000
- 虚拟机系统属性:
java -Dserver.port=9000 -jar bootsample.jar
- Web上下文访问目录
server.servlet.context-path=/config
- 绑定IP地址,适合多网卡环境
server.address
- 设置会话过期时间,单位为秒
server.session.timeout
- 出错处理路径
server.error.path
- Web服务器配置,内置
Tomcat
。也可以使用Jetty
,Undertow
。
- 引入Web服务器的
starter
依赖,以Undertow
为例。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
- 剥除内置
Tomcat
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
Undertow
的性能要由于Tomcat
和Jetty
,推荐使用。
- 日志配置
默认情况下,Spring Boot 使用LogBack
作为日志的实现,使用apache Commons Logging
作为日志接口。
public class DemoController {
private Log log = LogFactory.getLog(DemoController.class);
//...
}
日志格式举例:
2019-01-02 13:21:01.556 INFO 9884
---
[ restartedMain] o.s.b.w.e.u.UndertowServletWebServer:
Undertow started on port(s) 9090 (http) with context path '/config'
格式 | 说明 | 备注 |
2019-01-02 13:21:01.556 | 日期和时间 | |
INFO | 日志级别 | ERROR、WARN、INFO、TRACE和DEBUG 关于日志模块可以查看以往博文: |
9884 | 进程Id | |
— | 分隔符号 | |
[ restartedMain] | 线程名称 | |
o.s.b.w.e.u.UndertowServletWebServer | 所访问的权限的类名 | |
Undertow started on port(s) 9090 (http) with context path ‘/config’ | 消息体 | 可以看出,运行在8090端口下,且上下文路径配置为"/config" |
默认情况下,INFO
级别以上的信息才会打印到控制台,也可以自定义日志输出级别。
logging.level.root=info
logging.level.org.springframework=info
# 日志输出路径及文件
logging.path:e:/temp/log
logging.file = my.log
当日志文件大小达到 10MB 的时候,会自动重新生成一个新的日志文件,同时还可以对日志输出和文件输出进行格式控制。(仅适用内置的logback)
logging.pattern.console=%level %date{HH:mm:ss} %logger{20}.%M %L :%m%n
logging.pattern.file= %level %date{ISO8601} [%thread] %logger{20}.%M %L :%m%n
格式 | 说明 |
%level | 输出日志级别 |
%date | 日志记录时间 {ISO8601}标准日志格式输出 {yyyy-MM-dd HH:mm:ss.SSS} |
%logger | 用于输出Logger名字(包名 + 类名) {n}限制输出长度 原则上尽可能显示类名、压缩包名 |
%thread | 当前线程名 |
%M | 日志发生时的方法名称 |
%L | 日志调用所在的代码行(线上运行不建议使用) |
%m | 日志信息 |
%n | 日志换行 |
- 读取应用配置:从配置文件 application.properties 读取内容
- 通用 Environment类
Environment 是一个通用的读取应用程序运行时的环境变量的类,可以读取 application、properties、命令行输入参数、系统属性、操作系统环境变量等。同时,Environment 是 Spring Boot 最早初始化的一个类。
@Configuration
public class EnvConfig implements BeanPostProcessor {
// Spring 容器自动注入
@Autowired
private Environment env;
public int getServerPort() {
return env.getProperty("server.port", Integer.class);
}
}
读取 | 返回值 |
env.getProperty(“user.dir”) | 程序运行的目录,IDE中工程目录 user.dir是系统属性 |
env.getProperty(“user.home”) | 执行程序的用户的home目录 user.home是系统属性 |
env.getProperty(“JAVA_HOME”) | 读取设置的环境变量(不区分大小写) |
- @Value 注解获取
直接通过@Value
注解注入配置信息到 Spring 管理的 Bean 中:
@Value("${server.port}")
Integer port;
注意,@Value
并不能在任何 Spring 管理的 Bean 中使用,因为 @Value
本身是通过 AutowiredAnnotationBeanPostProcessor
实现的。[BeanPostProcessor
接口的实现类]@Value
注解支持 SpEL
表达式,如果属性不存在,可以提供默认值:
@Value("${cache.enable:false}")
private boolean isCache;
- @ConfigurationProperties
通常情况下,将一组同样类型的配置属性映射为一个类更为方便,比如服务器配置。
server.port=9090
server.context-path=/config
以上配置都是与 Web 服务器配置相关,都有 server 前缀。因此可以使用 @ConfigurationProperties
来获取该前缀配置。
@ConfigurationProperties("server")
@Configuration
public class ServerConfig {
private int port;
private String contextPath;
}
在处理被 @ConfigurationProperties 注解的类,会自动将 -
和 _
,转化为Java的命名规范(驼峰式)
- 自动装配
Spring 容器的配置核心就是使用@Configuration
作用在类上,并且联合在此类采用@Bean
注解的方法,声明 Spring 管理的 Bean。
@Configuration
public class MyConfiguration {
@Bean
public TestBean getBean() {
return new TestBean();
}
}
如上代码中,MyConfiguration 类使用了注解 @Configuration
,向 Spring 表明这是一个配置类,类里面所有带 @Bean
注解的方法都会被 Spring 调用,返回对象将作为一个 Spring 容器管理的 Bean。
- Bean 条件装配
Spring Boot可以通过有无指定Bean
来决定是否配置Bean
。使用@ConditionalOnBean
,在当前上下文中存在某个对象是,才会实例化一个Bean;使用@ConditionalOnMissingBean
,在当前上下文中不存在某个对象时,才会实例化一个Bean。
@Configuration
// 该配置类生效的前提是:上下文中已经配置了 DataSource。
@ConditionalOnBean(DataSource.class)
public class MyConfig {}
- Class 条件装配
Class 条件装配是按照某各类是否在Classpath
中决定是否要配置Bean。@ConditionalOnClass
标识当 classpath 有指定的类时,配置生效。
@Configuration
@ConditionalOnClass(JestClient.class)
public class JestAutoConfiguration {}
这段代码用于配置 Elasticsearch,使用 Jest
驱动,因此配置生效的前提条件是 classpath 中有 JestClient.class
类。
- Environment 装配
@ConditionalOnProperty(prefix = "ces", name = "message.enabled", havingValue = "true", matchIfMissing = true)
public class MsgConfig {}
@ConditionalOnProperty 注解根据prefix
+ name
(前缀和名称)来读取Environment
的变量包含属性(K-V),根据其值与 havingValue
值作比较决定配置是否生效 [ 默认不为false即为生效 ]。matchIfMissing
为 true
意味着如果 Environment
没有包含该前缀和名称的配置也可生效 [默认为false]。
- 其他条件装配
- @ConditionalOnExpression,当表达式为
true
时,才会实例化一个 Bean,支持SpEL表达式。 - @ConditionalOnJava,指定Java版本,如下栗子:
@ConditionalOnJava(range = Range.EQUAL_OR_NEWER, value = JavaVersion.EIGHT)