1. SpringBoot 的基础配置

在 application.properties 中即可完成 springboot 的配置;

1.1 监听端口配置

默认的监听端口是8080,但是可以用如下三种方式来修改监听的端口:

  • 在 application.properties 中:server.port=9090
  • 启动系统的时候:java -jar target\springboot-demo-1.0.0.jar --server.port=9090
  • 启动系统的时候:java -Dserver.port=9090 -jar target\springboot-demo-1.0.0.jar

    1.2 web 上下文配置

    默认的web上下文是:/,可以通过属性来修改web上下文:
    server.context-path=/springboot-demo

    1.3 使用其他 web 服务器

    默认的 web 服务器是用的内嵌的 tomcat,可以使用 jetty 或者是 undertow;

比如使用 jetty 作为 web 服务器:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-jetty</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-web</artifactId>
  8. <exclusions>
  9. <exclusion>
  10. <groupId>org.springframework.boot</groupId>
  11. <artifactId>spring-boot-starter-tomcat</artifactId>
  12. </exclusion>
  13. </exclusions>
  14. </dependency>

但是一般来说,都是用 tomcat 作为 web 容器即可,较为重要的配置参数如下:

# 打开tomcat访问日志
server.tomcat.accesslog.enabled=true
# 访问日志所在的目录
server.tomcat.accesslog.directory=/home/logs
# 允许HTTP请求缓存到请求队列的最大个数,默认是不限制的
server.tomcat.accept-count=
# 最大连接数,默认是不限制的,如果连接数达到了上限,那么剩下的连接就会保存到请求缓存队列里,也就是上面参数指定的个数
server.tomcat.max-connections=
# 最大工作线程数
server.tomcat.max-threads=
# HTTP POST内容最大长度,默认不限制
server.tomcat.max-http-post-size=

2. spring 组件加载外部配置文件

在实际开发中,将核心配置放在外部配置文件,是很重要的。因为通常我们都是对不同的环境使用一套完全不同的配置,但是保证我们的代码必须是相同的。

比如我们有一个类,其中要从外部配置文件中注入一个 name 属性:

// 无论用什么spring组件都可以被注入外部配置
@Component
public class MyBean {
    // 用@Value注解就可以将外部配置注入到类中来
    // 对配置项的名称用${}形式来表达
    @Value("${name}")
    private String name;
    // ...
}

然后通常,我们会在 src/main/resources 中,放置一个 application.properties,其中可以给 name 属性一个值。
也可以在命令行中传递这个参数值来替代:java -jar app.jar --name="Spring"

而且 spring boot 还提供了一个随机属性值生成器,供我们使用, 可以对某个属性是用的随机生成的一个值:

my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}

当然,也可以用 application.yml 来替代 application.properties,用 yaml 格式来编写配置文件,但是这两种方式都可以,一般没必要搞的那么复杂,用 application.properties 也就可以了。

3. springboot 多环境支持

spring boot 支持使用 @Profile 注解来标志,在哪个环境 profile 下,可以激活使用某个 @Configuration 类:

@Configuration
@Profile("production")
public class ProductionConfiguration {
    // ...
}

接着可以在启动的时候,命令行中,使用如下参数来指定某个环境 profile:--spring.profiles.active=dev,hsqldb

但是实际上如果基于 spring boot 的 profile 支持来做,一般是没法完全满足我们的期望的,所以多环境 profile 支持,通常还是基于彻底的 maven profile 来使用,不同的 profile 直接对应不同的文件夹,然后 mvn pakcage 打包的时候,指定对应的 profile 来打包,将对应环境的配置文件,全部放到src/main/resources下面去。

这种方式是最彻底的,而且足够灵活;

4. 系统读取应用的配置

4.1 Enviroment 类

spring boot 提供了一个 Environment 类,可以读取 applicaiton.properties、命令行参数、系统参数、操作系统环境变量,等等,各种参数和配置。可以通过 spring bean 注入的方式获取到这个 Environment,很多时候,可能你并不想直接使用 @Value 将某些参数读取到系统里面来,但是你可以注入一个 Environment,从这个里面去获取需要的一些参数;

@Configuration
public class EnvironmentConfig {
    @Autowired
    private Environment env;

    public int getServerPort() {
        return env.getProperty("server.port", Integer.class);
    }

}

4.2 @Value

也可以通过 @Value 直接将外部的配置参数注入到配置管理类中;

这块可以参考我们之前写的那个 DruidDbConfig 类,就是基于 @Value 将外部的 druid 配置参数注入进来,然后基于配置参数初始化了一个 Druid 连接池 bean;

4.3 @ConfigurationProperties

如果有一组相关联的配置属性,比如说下面这样的:

server.port=9090
server.context-path=/springboot-demo

都是 server 打头的,那么可以一次性将一组配置属性读取到一个配置管理类中:

@ConfigurationProperties("server")
@Configuration
public class ServerConfig {

    private int port;
    private String contextPath;

    // port和contextPath的getter和setter方法

}

5. spring boot 的自动装配

spring boot 的核心思想,就是用 @Configuration 来标注一个类,从外部配置文件中,基于 @Value 或者是 @ConfigurationProperties 来加载各种配置信息进来,然后基于这些配置信息,实例化对应的bean;