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的性能要由于TomcatJetty,推荐使用。
  • 日志配置
    默认情况下,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即为生效 ]。matchIfMissingtrue 意味着如果 Environment 没有包含该前缀和名称的配置也可生效 [默认为false]。

  • 其他条件装配
  • @ConditionalOnExpression,当表达式为 true 时,才会实例化一个 Bean,支持SpEL表达式。
  • @ConditionalOnJava,指定Java版本,如下栗子:
@ConditionalOnJava(range = Range.EQUAL_OR_NEWER, value = JavaVersion.EIGHT)