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.youkuaiyun.com/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)
-

本文深入解析SpringBoot的配置方式,包括应用属性配置、Web服务器配置、日志配置、读取应用配置等内容,以及如何使用不同注解和配置类进行条件装配。
7682

被折叠的 条评论
为什么被折叠?



