新建 Spring Boot 项目
这个部分 Idea,Spring Boot 官网工具都能够创建 Spring Boot 项目,这里省略。
Spring Boot 工程的 pom.xml
新建的 Spring Boot 工程项目中的 pom.xml 文件有父依赖。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
这块配置就是Spring Boot父级依赖,有了这个,当前的项目就是Spring Boot项目了,spring-boot-starter-parent是一个特殊的starter,它用来提供相关的Maven默认依赖,使用它之后,常用的包依赖可以省去version标签。
继续看 spring-boot-starter-parent
的 pom.xml 文件,可以看到它还有父依赖。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
在 spring-boot-dependencies
的 pom.xml 文件中我们才看到了定义的一些第三方包的版本属性信息。
<properties>
<!-- Dependency versions -->
<activemq.version>5.14.5</activemq.version>
<antlr2.version>2.7.7</antlr2.version>
<appengine-sdk.version>1.9.59</appengine-sdk.version>
<artemis.version>1.5.5</artemis.version>
<aspectj.version>1.8.13</aspectj.version>
<assertj.version>2.6.0</assertj.version>
<atomikos.version>3.9.3</atomikos.version>
...
</properties>
这里只截取了一部分,完整的大家可以看一下 spring-boot-dependencies
的 pom.xml。
在 spring-boot-dependencies
中还定义了一些 starter。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.5.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>1.5.9.RELEASE</version>
</dependency>
...
这个就是我们在 Spring Boot 项目中,添加了父依赖之后,添加 starter 和 一些第三方包的时候不用填写 version 的秘密。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
如果你不想使用 Spring Boot 指定的第三方包的版本,你可以在自己的项目中定义第三方依赖项的版本来覆盖 Spring Boot 指定的版本。比如 spring-boot-dependencies
中指定了 logback
的版本为 1.1.11
。
<logback.version>1.1.11</logback.version>
现在我们想在自己的项目中使用 logback
的版本是 1.2.3
,可以在自己的项目 pom.xml 文件 properties
中重新指定一下 logback
的版本即可。
<properties>
<logback.version>1.2.3</logback.version>
...
</properties>
当然并不是每个人都愿意继承 spring-boot-starter-parent
这个父依赖的。这个可能是因为自己公司会提供标准的 parent 父依赖(比如笔者公司就使用 inf-bom 来指定公司基础组件的版本信息)。如果遇到这种情况,不能依赖 spring-boot-starter-parent
,但是又想使用 spring-boot-starter-parent
提供的依赖管理功能,这样就可以不用写 version 了,这个时候可以通过使用 scope = import
依赖关系来保持依赖关系管理:
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.9.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
使用这种方式来管理依赖关系时,如果想使用自定义第三方版本时,不能使用前面提到的在自己的项目 pom.xml 文件 properties
中重新指定一下第三方 jar 包版本。要实现相同的结果,您需要在 spring-boot-dependencies
项之前的项目的 dependencyManagement 中添加一个配置,例如,要升级到另一个 logback 版本,您可以将以下内容添加到pom.xml 中。
<dependencyManagement>
<dependencies>
<!-- Override Spring Data release train provided by Spring Boot -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.9.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Spring Boot 的配置文件
Spring Boot使用了一个全局的配置文件application.properties,放在src/main/resources目录下或者类路径的/config下。Sping Boot的全局配置文件的作用是对一些默认配置的配置值进行修改。
自定义属性
com.elvis.name="懒癌正患者"
com.elvie.wish="希望世界和平"
然后直接在要使用的地方通过注解@Value(value=”${config.name}”)就可以绑定到你想要的属性上面
@RestController
public class UserController {
@Value("${com.elvis.name}")
private String name;
@Value("${com.elvie.wish}")
private String wish;
@GetMapping("hello")
public ResultView hello() {
return ResultView.builder().data(name + wish).build();
}
}
此时在浏览器中访问这个路径就能看到响应结果
{
"code": 0,
"message": "success",
"data": "懒癌正患者希望世界和平"
}
但是当自定义的配置属性比较多,使用这种方式来一个一个绑定到属性上,是不是很麻烦
@Value("${com.elvis.name}")
private String name;
@Value("${com.elvie.wish}")
private String wish;
这个时候可以定义一个配置类,这里我定义为 ElvisConfig
, 顶部需要使用注解 @ConfigurationProperties(prefix = "com.elvis")
来指明使用哪个
@Data
@ConfigurationProperties(prefix = "com.elvis")
public class ElvisConfig {
private String name;
private String wish;
}
这里配置完还需要在 Spring Boot 入口类加上@EnableConfigurationProperties
并指明要加载哪个bean。
@SpringBootApplication
@EnableConfigurationProperties({ElvisConfig.class})
public class Aggregation {
public static void main(String[] args) {
SpringApplication.run(Aggregation.class, args);
}
}
@RestController
public class UserController {
@Autowired
private ElvisConfig elvisConfig;
@GetMapping("hello")
public ResultView hello() {
return ResultView.builder().data(elvisConfig.getName() + elvisConfig.getWish()).build();
}
}
参数间引用
在 application.properties
中的各个参数之间也可以直接引用来使用,就像下面的设置:
com.elvis.name="懒癌正患者"
com.elvie.wish="希望世界和平"
com.elvis.says=${com.elvis.name}说${com.elvie.wish}
使用自定义配置文件
有时候我们不希望把所有配置都放在application.properties
里面,这时候我们可以另外定义一个,这里我明取名为test.properties,
路径跟也放在src/main/resources下面。
test.properties
的内容
com.elvis.name="懒癌正患者"
com.elvie.wish="希望世界和平"
我们新建一个bean类,如下:
@Data
@Configuration
@ConfigurationProperties(prefix = "com.elvis")
@PropertySource("classpath:test.properties")
public class ConfigTestBean {
private String name;
private String wish;
}
这里要注意哦,有一个问题,如果你使用的是1.5以前的版本,那么可以通过locations指定properties文件的位置,这样:
@ConfigurationProperties(prefix = "com.elvis",locations="classpath:test.properties")
但是1.5版本后就没有这个属性了,找了半天发现添加@Configuration
和@PropertySource(“classpath:test.properties”)
后才可以读取。
配置文件的优先级
application.properties
和application.yml
文件可以放在以下四个位置:
- 外置,在相对于应用程序运行目录的/congfig子目录里。
- 外置,在应用程序运行的目录里
- 内置,在config包内
- 内置,在Classpath根目录
同样,这个列表按照优先级排序,也就是说,src/main/resources/config下application.properties覆盖src/main/resources下application.properties中相同的属性,此外,如果你在相同优先级位置同时有application.properties和application.yml,那么application.properties里的属性里面的属性就会覆盖application.yml。
Profile-多环境配置
当应用程序需要部署到不同运行环境时,一些配置细节通常会有所不同,最简单的比如日志,生产日志会将日志级别设置为WARN或更高级别,并将日志写入日志文件,而开发的时候需要日志级别为DEBUG,日志输出到控制台即可。
如果按照以前的做法,就是每次发布的时候替换掉配置文件,这样太麻烦了,Spring Boot的Profile就给我们提供了解决方案,命令带上参数就搞定。
这里我们来模拟一下,只是简单的修改端口来测试
在Spring Boot中多环境配置文件名需要满足application-{profile}.properties
的格式,其中{profile}
对应你的环境标识,比如:
- application-dev.properties:开发环境
- application-prod.properties:生产环境
想要使用对应的环境,只需要在application.properties中使用spring.profiles.active属性来设置,值对应上面提到的{profile},这里就是指dev、prod这2个。
当然你也可以用命令行启动的时候带上参数:
java -jar xxx.jar --spring.profiles.active=dev
我给不同的环境添加不同的端口属性server.port
,然后根据指定不同的spring.profiles.active
来切换使用。各位可以自己试试。这里就不贴代码了。