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
- application.properties:
- 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
,推荐使用。 -
- Web监听端口配置
-
日志配置
默认情况下,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 关于日志模块可以查看以往博文: https://blog.csdn.net/Nerver_77/article/details/82855061 |
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)
-